L'app per Android su cui sto lavorando ha un'unica MainActivity e ogni schermata dell'app è implementata come frammento. Ogni frammento viene istanziata simili nel MainActivity come una variabile di classe privato:Aggiornamento di un frammento in risposta all'interazione di Android Navigation Drawer
public class MainActivity extends Activity implements MainStateListener {
private FragmentManager fm = getFragmentManager();
private BrowseFragment browseFragment = BrowseFragment.newInstance();
...
V'è un singolo 'telaio frammento' che carica ogni frammento schermo. Quando si passa schermi nell'applicazione questo codice è chiamato a caricare un frammento:
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.frag_frame, incoming);
ft.addToBackStack(null);
ft.commit();
fm.executePendingTransactions();
Ogni frammento schermo ha un ascoltatore che consente il frammento di chiamare vari metodi nel MainActivity:
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mainStateListener = (MainStateListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement MainStateListener");
}
}
L'edizione che sto avendo sta aggiornando un aspetto di un frammento da un cassetto di navigazione che esce nel MainActivity. Il cassetto di navigazione deve aggiornare il frammento, e utilizza questo codice per farlo:
navigationDrawer.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
browseFragment.doSomethingOnBrowserFragment();
}
});
le cose funzionano bene quando fino a quando si modifica l'orientamento. Quindi il frammento della schermata corrente viene caricato correttamente (browseFragment). Ma poi quando si fa clic sul cassetto di navigazione che causa il metodo doSomethingOnBrowserFragment() per l'esecuzione, ottengo un'eccezione di puntatore nullo a causa del fatto che l'oggetto mainStateListener stesso (collegato a browseFragment) è nullo. Da quanto so del ciclo di vita di Fragment questa variabile non dovrebbe essere nulla perché il metodo onAttach() viene eseguito prima di tutto e imposta la variabile mainStateListener. Inoltre, se ho un pulsante su tale browserFragment che utilizza l'oggetto mainStateListener (a seguito di una modifica dell'orientamento), facendo clic sul pulsante non si ha mai questo problema con il puntatore nullo.
traccia stack:
08-04 16:23:28.937 14770-14770/co.openplanit.totago E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: co.openplanit.totago, PID: 14770
java.lang.NullPointerException
at co.openplanit.totago.MapFragment.enableOfflineMode(MapFragment.java:489)
at co.openplanit.totago.MainActivity.setMapMode(MainActivity.java:663)
at co.openplanit.totago.MainActivity.itineraryMapDrawerSelectItem(MainActivity.java:610)
at co.openplanit.totago.MainActivity.access$200(MainActivity.java:52)
at co.openplanit.totago.MainActivity$5.onItemClick(MainActivity.java:420)
at android.widget.AdapterView.performItemClick(AdapterView.java:299)
at android.widget.AbsListView.performItemClick(AbsListView.java:1158)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:2957)
at android.widget.AbsListView$3.run(AbsListView.java:3850)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5103)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:606)
at dalvik.system.NativeStart.main(Native Method)
Mi sembra il problema potrebbe essere che l'utilizzo del cassetto di navigazione è in realtà interagendo con il ciclo di vita browseFragment e inducendolo a staccare o qualcosa del genere.
Qualsiasi suggerimento su come risolvere questo sarebbe molto apprezzato.
Si prega di inviare la traccia di errore cat di registro. – avinash
Ho aggiunto la traccia di errore al post. –
In base alla traccia dello stack, sembra che nulla in onItemClick stia causando NullPointerException. Succede in MapFragment sulla linea 489. Che cosa c'è su quella linea? Probabilmente qualcosa non viene ripristinato in MapFragment sul cambio di orientamento ed è nullo. –