webentwicklung-frage-antwort-db.com.de

Android: getSupportActionBar () gibt in der ActionBarSherlock-Bibliothek immer null zurück

Ich versuche, die Bibliothek ActionBarSherlock zu verwenden, um abwärtskompatible ActionBar-Unterstützung mit Registerkarten in meiner Android-App bereitzustellen. Deshalb habe ich den neuesten Build heruntergeladen, die Demo erstellt und ausgeführt. 

Wenn Sie zur Aktionsleiste wechseln, wählen Sie die Tab-Navigation, die jedes Mal abstürzt. Hier ist der Stack-Trace:

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  

Ich kann mich mit meiner App nicht weiterbewegen, bis dies behoben ist. Ich habe eine Menge Code geschrieben, die Aktionsleiste in meiner App eingerichtet und versucht, ihn auszuführen. Er stürzt mit einem NPE ab, weil der Rückgabewert null beim Aufruf von getSupportActionBar() zurückgegeben wird.

Der entsprechende Code befindet sich tatsächlich in der Demo für die Bibliothek:

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

Sie sollten das Sherlock-Design zu Ihrer Anwendung hinzufügen

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

Ich hatte das gleiche Problem auf dem Android ICS 4.0.4. Ich habe requestWindowFeature(Window.FEATURE_NO_TITLE); auf dem FragmentActivity verwendet, aber das hat das ausgeblendet ActionBar auf ICS + -Geräten, die dazu geführt haben, dass getSupportActionBar() null ist.

Einfach das entfernt:
requestWindowFeature(Window.FEATURE_NO_TITLE);

Und es funktionierte wie ein Zauber.

Hoffe es hilft jemandem.

62
Mario Santos

Ein weiterer Grund dafür ist, dass dies bei Honeycomb + -Geräten der Fall ist, weil das Attribut windowNoTitle in Ihrem Stil festgelegt ist. Befreien Sie sich davon, denn ActionBarSherlock entfernt es automatisch in Geräten von Honeycomb, die sich bereits vor Honeycomb befinden.

37
Donn Felker

Ein anderer Grund, warum Sie null von getSupportActionBar() bekommen könnten, ist der Versuch, es vor setContentView(R.layout.main) aufzurufen oder in Ihrem Beispiel ein Fragment hinzuzufügen. 

Ich habe oncreate überarbeitet und fälschlicherweise getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); nach super.onCreate(savedInstanceState); gestellt. 

14
scottyab

Hier ist eine lustige: Das Thema nicht auf - setzen 

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

Ein weiterer Grund, warum Sie von getSupportActionBar() null erhalten könnten, ist die Verwendung der Aktivität in einem TabHost auf Honeycomb +.

6
aleb

Abhängig davon, wie Ihr Code geschrieben wird. Stellen Sie sicher, dass Sie die Symbolleiste zuerst festgelegt haben, bevor Sie sie aufrufen.

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

Ich habe mich gerade in Manifest geändert

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

zu:

  Android:theme="@style/AppTheme"

und der Fehler ist weg

2
CodeToLife

sie sind Theme.Sherlock oder Theme.Sherlock.Light als Ihre Aktivität oder das -Anwendungsdesign im Manifest deklariert. Oder Sie verwenden ein benutzerdefiniertes Design, das von einer der beiden erbt

Beispiel:-

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

sie können auch ein dunkles Thema verwenden: -

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

wann immer wir customview mit sherlock library einstellen. Entfernen Sie einfach dieses requestWindowFeature (Window.FEATURE_NO_TITLE); so machen wir customview mit sherlock bar library ..

            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

Ich hatte dieses Problem, nachdem ich vergessen hatte, super.onCreate()

1
Navarr

Ich bin darauf gestoßen, nachdem ich meinem Projekt eine Bibliothek hinzugefügt habe. Das Hilfsmittel bestand darin, in der Bibliothek nachzuschauen und alle Stilnamen "AppTheme" zu entfernen, wenn Sie denselben Themennamen in Ihrem Manifest verwenden. Bei meinem Galaxy S4 (Jelly Bean) gab es keinen Konflikt, während bei meinem Galaxy Tab ein Konflikt auftrat.

0
Chris Sprague

Ich habe Android:theme="@Android:style/Theme.Dialog" zu meiner Aktivität in der Android-Manifest-Datei hinzugefügt, um diese zu einer Dialogaktivität zu machen. Auch dies entfernt die Aktionsleiste und damit einen Nullzeiger. Entfernen Sie es oder rufen Sie nicht getSupportActioBar auf.

0
mugume david

Ich mache diesen Fehler, weil ich die Toobar in der Fragment-XML-Datei hinzufüge. Der Code, um die Symbolleiste in fragment zu finden, lautet: getActivity (). FindViewByid (id ...), aber meine Symbolleiste befindet sich in einer Fragment-XML-Datei, sodass keine Symbolleiste gefunden wurde und keine Symbolleiste setSipprotActionBar () und auch nichts erhalten wurde Wenn getSupportActionBar () . Denken Sie daran: Setzen Sie die Symbolleiste nicht in die XML-Datei Ihres Fragments.

0
nikerxu