web-dev-qa-db-fra.com

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

J'essaie d'utiliser la bibliothèque ActionBarSherlock pour fournir un support ActionBar compatible avec les versions antérieures avec des onglets dans mon application Android. J'ai donc téléchargé la dernière version, construit la démo et exécuté. 

Si vous allez dans la barre d’action, puis sélectionnez Navigation par tabulation, il 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 cela n'est pas corrigé. J'ai écrit un tas de code, configuré la barre d'actions dans mon application et essayé de l'exécuter. Un blocage avec un NPE s'est bloqué en raison de la valeur de retour NULL de l'appel getSupportActionBar().

Le code correspondant est actuellement 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) {
    }
}
65
Christopher Perry

Vous devriez 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">
81
weakwire

J'ai eu le même problème sur le Android ICS 4.0.4. J'utilisais requestWindowFeature(Window.FEATURE_NO_TITLE); sur FragmentActivity, mais cela masquait l'ActionBar sur les périphériques ICS + qui rendait la getSupportActionBar() nulle.

Il suffit de retirer le:
requestWindowFeature(Window.FEATURE_NO_TITLE);

Et ça a fonctionné comme un charme.

J'espère que ça aide quelqu'un.

62
Mario Santos

Une autre raison pour laquelle cela se produit sur les appareils Honeycomb + est que l'attribut windowNoTitle est défini dans votre style. Débarrassez-vous de cela, car ActionBarSherlock le supprimera automatiquement dans les appareils pré-Honeycomb.

37
Donn Felker

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

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

14
scottyab

Voici un titre amusant: Ne définissez pas le thème - 

    Android:theme="@style/Theme.NoActionbar"
10
JY2k

Une autre raison pour laquelle vous pourriez obtenir null de getSupportActionBar() est lorsque l'activité est utilisée dans un TabHost sur Honeycomb +.

6
aleb

Selon la façon dont vous écrivez le code. assurez-vous d’avoir défini la barre d’outils avant de l’appeler.

  mToolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(mToolbar);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
5
Alia Ramli Ramli

Je viens de changer dans Manifest

Android:theme="@style/AppTheme.NoActionBar"

à:

  Android:theme="@style/AppTheme"

et l'erreur est partie

2
CodeToLife

vous êtes déclaré Thème.Sherlock ou Thème.Sherlock.Light en tant que votre thème d'activité ou dans le manifeste. Ou en utilisant un thème personnalisé qui hérite du

Exemple:-

<application
Android:allowBackup="true"
Android:icon="@drawable/ic_launcher"
Android:label="@string/app_name"
Android:theme="@style/Theme.Sherlock.Light" >

aussi vous pouvez utiliser le thème sombre: -

Android:theme="@style/Theme.Sherlock"
1
Dhaval

chaque fois que nous définissons customview en utilisant la bibliothèque sherlock. il suffit de supprimer cette requestWindowFeature (Window.FEATURE_NO_TITLE); comme cela nous faisons customview en utilisant la bibliothèque sherlock.

            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); 
    getSupportActionBar().setCustomView(R.layout.header_sherlock_xmllayout);
    header_tvleft = (TextView) findViewById(R.id.header_tvleft);
    header_tvleft.setText("Back");
1
harikrishnan

J'ai eu ce problème après (stupidement) avoir oublié d'appeler le super.onCreate()

1
Navarr

Je me suis heurté à cela après avoir ajouté une bibliothèque à mon projet. Le remède consistait à rechercher dans la bibliothèque et à supprimer tout nom de style "AppTheme" si vous utilisez ce même nom de thème dans votre manifeste. Il n'y avait pas de conflit sur mon Galaxy S4, Jelly Bean, alors qu'il y avait un conflit sur mon Galaxy Tab.

0
Chris Sprague

J'ai ajouté Android:theme="@Android:style/Theme.Dialog" à mon activité dans le fichier manifeste d'Android pour tenter d'en faire une activité de dialogue. Cela aussi supprimera la barre d'action d'où un pointeur nul. Supprimez-le ou n'appelez pas getSupportActioBar

0
mugume david

Je fais cette erreur parce que j'ajoute la toobar dans le fichier fragment xml. Le code pour trouver la barre d’outils dans fragment est la suivante: getActivity (). FindViewByid (id ...), mais ma barre d’outils est dans le fichier fragment xml, de sorte qu’aucune barre d’outils n’a été trouvée ni aucune when getSupportActionBar () . Alors, rappelez-vous: Ne placez pas la barre d’outils dans le fichier XML de votre fragment.

0
nikerxu