web-dev-qa-db-ja.com

Android:getSupportActionBar()はActionBarSherlockライブラリで常にnullを返します

ActionBarSherlock ライブラリを使用して、Androidアプリのタブで下位互換性のあるActionBarサポートを提供しようとしているので、最新のビルドをダウンロードし、デモをビルドし、走った。

アクションバーに移動すると、タブナビゲーションを選択すると毎回クラッシュします。スタックトレースは次のとおりです。

_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  
_

これが修正されるまで、アプリを進めることはできません。大量のコードを作成し、アプリにアクションバーを設定して実行しようとしましたが、getSupportActionBar()呼び出しのnull戻り値が原因でNPEでクラッシュしました。

関連するコードは、実際にはライブラリのデモに含まれています。

_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) {
    }
}
_
66

Sherlockテーマをアプリケーションに追加する必要があります

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

Android ICS 4.0.4。FragmentActivityでrequestWindowFeature(Window.FEATURE_NO_TITLE);を使用していましたが、これは隠れていましたgetSupportActionBar()がヌルになるICS +デバイスのActionBar。

単に削除しました:
requestWindowFeature(Window.FEATURE_NO_TITLE);

そしてそれは魅力のように働いた。

それが誰かを助けることを願っています。

62
Mario Santos

Honeycomb +デバイスでこれが起こるもう1つの理由は、windowNoTitle属性がスタイルに設定されているためです。 ActionBarSherlockがHoneycomb以前のデバイスから自動的に削除するので、それを取り除きます。

38
Donn Felker

getSupportActionBar()からnullを取得するもう1つの理由は、setContentView(R.layout.main)の前に、またはフラグメントを追加する例でそれを呼び出そうとしていることです。

Oncreateをリファクタリングし、誤ってgetSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);super.onCreate(savedInstanceState);の後に配置しました

14
scottyab

ここに面白いものがあります:テーマを設定しないでください-

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

getSupportActionBar()からnullを取得する別の理由は、Honeycomb +のTabHostでアクティビティが使用されている場合です。

6
aleb

コードの書き方によって異なります。呼び出す前にまずツールバーを設定したことを確認してください。

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

マニフェストで変更しました

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

に:

  Android:theme="@style/AppTheme"

そして、エラーがなくなった

2
CodeToLife

マニフェストのアクティビティまたはアプリケーションテーマとしてTheme.SherlockまたはTheme.Sherlock.Lightとして宣言されているか、これら2つのいずれかを継承するカスタムテーマを使用している

例:-

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

また、暗いテーマを使用できます:-

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

sherlockライブラリを使用してカスタムビューを設定するたびに。このrequestWindowFeature(Window.FEATURE_NO_TITLE)を削除するだけです。このように、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

super.onCreate()の呼び出しを(わずかに)忘れた後、この問題が発生しました。

1
Navarr

プロジェクトにライブラリを追加した後、これに遭遇しました。解決策は、マニフェストでこの同じテーマ名を使用している場合、ライブラリを調べて「AppTheme」というスタイル名を削除することでした。 Galaxy Tabで競合が発生したのに対し、Galaxy S4であるJelly Beanで競合は発生しませんでした。

0
Chris Sprague

追加した Android:theme="@Android:style/Theme.Dialog" Androidマニフェストファイルをダイアログアクティビティにするためのマニフェストファイル。これもアクションバーを削除するため、nullポインターになります。削除するか、getSupportActioBarを呼び出さないでください。

0
mugume david

フラグメントxmlファイルにtoobarを追加するため、この間違いを犯します。フラグメントでツールバーを見つけるためのコードはこれです:getActivity()。findViewByid(id ...)、私のツールバーはフラグメントxmlファイルにあります。 getSupportActionBar()の場合。覚えておいてください:フラグメントのxmlファイルにツールバーを入れないでください。

0
nikerxu