9

Sono appena passato da ActionBarSherlock a ActionBarCompat e tutto funzionava bene fino a quando non mi sono imbattuto in questo piccolo errore. Ho un'attività di base che si estende ActionBarActivity e ha 3 frammenti associati ad esso. In uno dei onAttach metodo di Frammenti, provo l'esecuzione di questo codice:NullPointerException quando si chiama getSupportActionBar() dall'interno di Fragment (ActionBarCompat)

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    final ActionBar actionBar = ((ActionBarActivity)activity).getSupportActionBar(); 

    actionBar.setHomeButtonEnabled(true); 
    actionBar.setDisplayHomeAsUpEnabled(true); 
    actionBar.setDisplayShowTitleEnabled(false); 
    actionBar.setTitle(""); 
} 

Funziona bene fino a quando provo a cambiare il mio orientamento dello schermo. Quindi ottengo un NullPointerException per questa riga di codice: actionBar.setHomeButtonEnabled(true);.

Come posso risolvere questo?

Edit:

Ecco l'intero registro di errore:

06-10 18:53:31.440: E/AndroidRuntime(18586): FATAL EXCEPTION: main 
06-10 18:53:31.440: E/AndroidRuntime(18586): Process: com.packagename.appname, PID: 18586 
06-10 18:53:31.440: E/AndroidRuntime(18586): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.packagename.appname/com.packagename.appname.activities.NewActivity}: java.lang.NullPointerException 
06-10 18:53:31.440: E/AndroidRuntime(18586): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2328) 
06-10 18:53:31.440: E/AndroidRuntime(18586): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2386) 
06-10 18:53:31.440: E/AndroidRuntime(18586): at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3947) 
06-10 18:53:31.440: E/AndroidRuntime(18586): at android.app.ActivityThread.access$1000(ActivityThread.java:169) 
06-10 18:53:31.440: E/AndroidRuntime(18586): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1283) 
06-10 18:53:31.440: E/AndroidRuntime(18586): at android.os.Handler.dispatchMessage(Handler.java:102) 
06-10 18:53:31.440: E/AndroidRuntime(18586): at android.os.Looper.loop(Looper.java:136) 
06-10 18:53:31.440: E/AndroidRuntime(18586): at android.app.ActivityThread.main(ActivityThread.java:5476) 
06-10 18:53:31.440: E/AndroidRuntime(18586): at java.lang.reflect.Method.invokeNative(Native Method) 
06-10 18:53:31.440: E/AndroidRuntime(18586): at java.lang.reflect.Method.invoke(Method.java:515) 
06-10 18:53:31.440: E/AndroidRuntime(18586): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268) 
06-10 18:53:31.440: E/AndroidRuntime(18586): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084) 
06-10 18:53:31.440: E/AndroidRuntime(18586): at dalvik.system.NativeStart.main(Native Method) 
06-10 18:53:31.440: E/AndroidRuntime(18586): Caused by: java.lang.NullPointerException 
06-10 18:53:31.440: E/AndroidRuntime(18586): at com.packagename.appname.fragments.NewFragment.onAttach(NewFragment.java:144) 
06-10 18:53:31.440: E/AndroidRuntime(18586): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:883) 
06-10 18:53:31.440: E/AndroidRuntime(18586): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104) 
06-10 18:53:31.440: E/AndroidRuntime(18586): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1086) 
06-10 18:53:31.440: E/AndroidRuntime(18586): at android.support.v4.app.FragmentManagerImpl.dispatchCreate(FragmentManager.java:1879) 
06-10 18:53:31.440: E/AndroidRuntime(18586): at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:215) 
06-10 18:53:31.440: E/AndroidRuntime(18586): at android.support.v7.app.ActionBarActivity.onCreate(ActionBarActivity.java:97) 
06-10 18:53:31.440: E/AndroidRuntime(18586): at com.packagename.appname.activities.NewActivity.onCreate(NewActivity.java:73) 
06-10 18:53:31.440: E/AndroidRuntime(18586): at android.app.Activity.performCreate(Activity.java:5451) 
06-10 18:53:31.440: E/AndroidRuntime(18586): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093) 
06-10 18:53:31.440: E/AndroidRuntime(18586): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2292) 
06-10 18:53:31.440: E/AndroidRuntime(18586): ... 12 more 

FYI: NewFragment linea 144 è: actionBar.setHomeButtonEnabled.

+0

dopo l'errore non solo parte di esso –

+0

@Rod_Algonquin appena aggiunto che – lschlessinger

risposta

8

onAttach() potrebbe essere troppo presto. Quando l'attività viene ricreata dopo una rotazione, è uno dei primi metodi chiamati, anche prima che l'attività sia completamente creata (vale a dire il suo onCreate() non è ancora finito). Quindi non sorprende che lo ActionBar non sia pronto.

Controllare il relationship between Activity and Fragment's lifecycles nella documentazione.

In breve: spostare questo codice in onActivityCreated() o onStart().

Ulteriori spiegazioni

Controllare il codice sorgente per ActionBarActivity:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    mImpl = ActionBarActivityDelegate.createDelegate(this); 
    super.onCreate(savedInstanceState); 
    mImpl.onCreate(savedInstanceState); 
} 
  • super.onCreate() è FragmentActivity.onCreate(), che ripristina eventuali frammenti precedenti dopo una rotazione.
  • mImpl.onCreate(savedInstanceState) è ActionBarActivityDelegate.onCreate(), che legge la variabile mHasActionBar dallo stile della finestra.
  • Prima che mHasActionBar sia vero, getSupportActionBar() restituirà sempre null.
+0

non è quello che [questo post ha detto] (http://stackoverflow.com/questions/18320713/getsupportactionbar-from-inside-of-fragment -actionbarcompat? rq = 1) ... – lschlessinger

+0

@lschessinger Funzionerà su _first_ 'onAttach()'. Ma non dopo una rotazione. Almeno con la versione corrente della libreria di supporto. – matiash

+0

Questo ha funzionato per me. L'unico cambiamento sarebbe sostituire 'activity' con' getActivity() '. Grazie! – lschlessinger

Problemi correlati