66 votes

Android : getSupportActionBar() renvoie toujours null dans la bibliothèque ActionBarSherlock

J'essaie d'utiliser le ActionBarSherlock pour fournir un support rétro-compatible de la barre d'action avec les onglets dans mon application Android, j'ai donc téléchargé la dernière version, construit la démo et l'ai exécutée.

Si vous allez dans la barre d'action, puis sélectionnez la navigation par onglet, cela se bloque à chaque fois. Voici la trace de la pile :

09-03 02:34:47.940: ERROR/AndroidRuntime(3078): FATAL EXCEPTION: main  
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.actionbarsherlock.sample.demos/com.actionbarsherlock.sample.demos.app.ActionBarTabNavigation}: java.lang.NullPointerException  
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1748)  
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1764)  
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at android.app.ActivityThread.access$1500(ActivityThread.java:122)  
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1002)  
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at android.os.Handler.dispatchMessage(Handler.java:99)  
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at android.os.Looper.loop(Looper.java:132)  
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at android.app.ActivityThread.main(ActivityThread.java:4025)  
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at java.lang.reflect.Method.invokeNative(Native Method)  
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at java.lang.reflect.Method.invoke(Method.java:491)  
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)  
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)  
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at dalvik.system.NativeStart.main(Native Method)  
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): Caused by: java.lang.NullPointerException  
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at com.actionbarsherlock.sample.demos.app.ActionBarTabNavigation.onCreate(ActionBarTabNavigation.java:19)  
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048)  
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1712)  
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): ... 11 more  

Je ne peux pas avancer avec mon application tant que ce problème n'est pas résolu. J'ai écrit un tas de code, j'ai configuré la barre d'action dans mon application et j'ai essayé de l'exécuter, mais elle se plante avec un NPE à cause de la valeur de retour nulle de la fonction getSupportActionBar() appeler.

Le code correspondant se trouve en fait dans la démo de la bibliothèque :

public class ActionBarTabNavigation extends FragmentActivity implements ActionBar.TabListener {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        getSupportFragmentManager()
            .beginTransaction()
            .add(android.R.id.content, FragmentStackSupport.CountingFragment.newInstance(0))
            .commit();

        getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        for (int i = 0; i < 3; i++) {
            ActionBar.Tab tab = getSupportActionBar().newTab();
            tab.setText("Tab " + i);
            tab.setTabListener(this);
            getSupportActionBar().addTab(tab);
        }
    }

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {
    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        getSupportFragmentManager()
            .beginTransaction()
            .replace(android.R.id.content, FragmentStackSupport.CountingFragment.newInstance(tab.getPosition()))
            .commit();
    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
    }
}

81voto

weakwire Points 6263

Vous devez ajouter le thème Sherlock à votre application.

<application android:icon="@drawable/icon" android:label="@string/app_name"
        android:debuggable="false" android:theme="@style/Theme.Sherlock">

62voto

Mario Santos Points 836

J'ai eu le même problème sur l'Android ICS 4.0.4. J'utilisais requestWindowFeature(Window.FEATURE_NO_TITLE); sur la FragmentActivity, mais c'est le masquage de la barre d'action sur les appareils ICS+ qui a provoqué l'apparition de l'erreur. getSupportActionBar() pour être nulle.

Il suffit d'enlever le :
requestWindowFeature(Window.FEATURE_NO_TITLE);

Et ça a marché comme un charme.

J'espère que cela aidera quelqu'un.

38voto

Donn Felker Points 3501

Une autre raison pour laquelle cela se produira sur les appareils Honeycomb+ est que la windowNoTitle est défini dans votre style. G

14voto

scottyab Points 6760

Une autre raison pour laquelle vous pouvez obtenir une valeur nulle de getSupportActionBar() tente de l'appeler avant setContentView(R.layout.main) ou, dans votre exemple, d'ajouter un fragment.

J'ai refactored oncreate et mis à tort getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); après super.onCreate(savedInstanceState);

6voto

aleb Points 861

A getSupportActionBar() est lorsque l'activité est utilisée dans un TabHost sur Honeycomb+.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X