2012-07-18 14 views
12

Estoy usando Action Bar en una actividad. Para cada pestaña, estoy mostrando un diseño diferente. Dado que el diseño es demasiado pesado. Así que estoy inflando cada diseño en una vista. Así que en cada pestaña seleccionarandroid get activity devuelve nulo

public void onTabSelected(Tab tab, FragmentTransaction ft) { 
    if (mView == null) { 
     mView = LayoutInflater.from(mAct).inflate(mLayout, null); // mAct is Activity reference 
    } 
    mAct.setContentView(mView); 
    for (int i = 0; i < mFrags.length; i++) { 
    mFrags[i] = (LutronFragment) mAct.getFragmentManager() 
     .findFragmentById(mIds[i]); 

    if (mFrags[i] != null) { 
     mFrags[i].setupHeader(); 
     } 
    } 
} 
public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
    for (Fragment f : mFrags) { 
    try { 
     if (f != null) { 
     ft.remove(f); 
     } 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } 
    } 
} 

por lo que ahora si selecciono pestaña segunda vez y hacer alguna operación en esa pestaña, aplicación obtener chocó en getActivity. (NullPointerException)

sugerir por favor si hay algún otro enfoque para caché diseño pesado.

+0

¿Estás diciendo que 'mAct' pasa a ser nulo? Además, no tiene sentido almacenar en caché, lo que debe hacer es tener la carga de diseño en segundo plano, mientras que el primer plano debe tener alguna interfaz de usuario como un diálogo de progreso o algún tipo de pantalla interactiva de usuario intermedio. Finalmente, considere reducir el peso de su diseño o cargue elementos a pedido. ¿Puedes publicar tu diseño xml para ver si realmente es pesado? – gaara87

Respuesta

36

Es probable que el problema sea que está utilizando un Fragmento anterior que se ha separado de su Actividad.

Por lo tanto, la primera vez que crea su Fragmento, se adjunta a su actividad. Todo es bueno. Luego, cuando cambias de pestaña, tu fragmento puede separarse o no de la actividad. Cuando vuelve a tabular, el fragmento anterior puede separarse de la actividad y, por lo tanto, getActivity() devuelve nulo.

Esto puede suceder si intenta mantener referencias a sus Fragmentos, en lugar de tener acceso a ellos a través del FragmentManager.

También puede suceder si su adaptador devuelve una referencia a un fragmento en lugar de un nuevo fragmento. He caído en esta trampa.

(Publicación de un código en el que crear sus fragmentos podrían ayudar)

Editar

Tal vez echar un vistazo a this y cómo se crean añadir sus oyentes actionbar. Necesitas alcance a tu actividad. La forma en que lo hacen es definir el oyente en la Actividad/Fragmento (mediante la implementación de una interfaz) y luego adjuntarlo a la Pestaña. Esto le dará alcance y probablemente sea una forma más estable de hacer las cosas.

+0

Por favor edite su pregunta y agréguela en la parte inferior. Es realmente difícil tratar de leer esto. –

+0

¿Desde dónde llamas este código? Parece que se llamaría desde tu actividad. Si es así, ¿por qué mantener una referencia a su actividad en su actividad? ¿Por qué no simplemente llamar a 'setContentView (mView)' en lugar de 'mAct.setContentView (mView)'? –

+0

Plz ver la pregunta editada –

5

Esto puede suceder si crea un objeto anónimo dentro de un fragmento que llama al getActiviy(). Si se llama al getActivity() en el objeto anónimo después de que el fragmento se extraiga de la pila de fragmentos, getActivity() devolverá nulo. En ese punto, el fragmento ya no está asociado a una actividad.