2012-07-18 11 views
12

Sto utilizzando la barra delle azioni su un'attività. Per ogni scheda sto mostrando un layout diverso. Dal momento che il layout è troppo pesante. Quindi sto gonfiando ogni layout in una vista. Quindi, in ogni scheda selezionareandroid get restituisce attività null

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(); 
    } 
    } 
} 

Così Ora, se seleziono scheda seconda volta e fare un po 'di funzionamento su tale scheda, app si è schiantato su getActivity. (NullPointerException)

si prega di suggerire se c'è qualche altro approccio per layout pesante della cache.

+0

stai dicendo che 'mAct' diventa nullo? Inoltre, non vi è alcun punto nel layout di memorizzazione nella cache, ciò che si dovrebbe fare è caricare il layout in background mentre il foreground dovrebbe avere un'interfaccia utente come una finestra di dialogo di avanzamento o una sorta di schermata interabile di un utente intermedio. Infine, considera la possibilità di ridurre il peso del layout o di caricare gli elementi su richiesta. Puoi pubblicare il tuo layout xml per vedere se è effettivamente pesante? – gaara87

risposta

36

Il problema è molto probabile che si stia utilizzando un vecchio frammento che è stato rimosso dalla propria attività.

Quindi, la prima volta che crei il tuo frammento, è collegato alla tua attività. Va tutto bene. Quindi quando cambi scheda, il tuo frammento potrebbe o non potrebbe essere staccato dall'attività. Quando ci si collega ad esso, il vecchio frammento potrebbe essere staccato dall'attività e quindi getActivity() restituisce null.

Questo può accadere se si sta tentando di mantenere i riferimenti ai frammenti, piuttosto che accedervi tramite lo FragmentManager.

Può anche verificarsi se l'adattatore restituisce un riferimento a un frammento anziché a un nuovo frammento. Sono caduto in questa trappola.

(la pubblicazione del codice in cui si creano i frammenti potrebbero aiutare)

Modifica

Forse uno sguardo ai this e come creano aggiungere i loro ascoltatori ActionBar. Hai bisogno di spazio per la tua attività. Il modo in cui lo fanno è definire l'ascoltatore nell'attività/frammento (tramite l'implementazione di un'interfaccia) e quindi collegarlo alla scheda. Questo ti darà la possibilità e probabilmente è un modo più stabile di fare le cose.

+0

Per favore modifica la tua domanda e aggiungila in fondo piuttosto. È davvero difficile provare a leggerlo. –

+0

Da dove chiami questo codice? Sembra che verrebbe chiamato dalla tua attività. In tal caso, perché mantenere un riferimento alla tua attività nella tua attività? Perché non chiamare semplicemente 'setContentView (mView)' piuttosto che 'mAct.setContentView (mView)'? –

+0

Plz vedere la domanda modificata –

5

Questo può accadere se si crea un oggetto anonimo all'interno di un frammento che chiama getActiviy(). Se si chiama getActivity() nell'oggetto anonimo dopo che il frammento è stato estratto dalla pila di frammenti, getActivity() restituirà null. A quel punto, il frammento non è più associato a un'attività.

Problemi correlati