Androidエラー[nullオブジェクト参照で仮想メソッド 'void android.app.ActionBar'を呼び出そうとしました]


97

ナビゲーションドロワー付きのビューページャーを実装するコードモジュールがありますが、コードを実行すると次のエラーが発生します

01-26 09:20:02.958: D/AndroidRuntime(18779): Shutting down VM
01-26 09:20:02.959: E/AndroidRuntime(18779): FATAL EXCEPTION: main
01-26 09:20:02.959: E/AndroidRuntime(18779): Process: com.example.tabwithslidingdrawer, PID: 18779
01-26 09:20:02.959: E/AndroidRuntime(18779): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.tabwithslidingdrawer/com.example.tabwithslidingdrawer.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.app.ActionBar.setDisplayHomeAsUpEnabled(boolean)' on a null object reference
01-26 09:20:02.959: E/AndroidRuntime(18779):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2314)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2388)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at android.app.ActivityThread.access$800(ActivityThread.java:148)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1292)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at android.os.Handler.dispatchMessage(Handler.java:102)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at android.os.Looper.loop(Looper.java:135)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at android.app.ActivityThread.main(ActivityThread.java:5312)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at java.lang.reflect.Method.invoke(Native Method)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at java.lang.reflect.Method.invoke(Method.java:372)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
01-26 09:20:02.959: E/AndroidRuntime(18779): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.app.ActionBar.setDisplayHomeAsUpEnabled(boolean)' on a null object reference
01-26 09:20:02.959: E/AndroidRuntime(18779):    at com.example.tabwithslidingdrawer.MainActivity.onCreate(MainActivity.java:95)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at android.app.Activity.performCreate(Activity.java:5953)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1128)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2267)
01-26 09:20:02.959: E/AndroidRuntime(18779):    ... 10 more
09:20:02.959: E/AndroidRuntime(18779): Caused by:
java.lang.NullPointerException: Attempt to invoke virtual method 'void
android.app.ActionBar.setDisplayHomeAsUpEnabled(boolean)' on a null
object reference 01-26 09:20:02.959: E/AndroidRuntime(18779):     at
com.example.tabwithslidingdrawer.MainActivity.onCreate(MainActivity.java:95)

この線を指す

// enabling action bar app icon and behaving it as a toggle button
        getActionBar().setDisplayHomeAsUpEnabled(true);
        getActionBar().setHomeButtonEnabled(true);

コード全体 http://pastebin.com/u1K72fr7

私のマニフェスト

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.tabwithslidingdrawer"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/Theme.Tabwithpager" >
        <activity
            android:name="com.example.tabwithslidingdrawer.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

android:theme = "@ style / Theme.Tabwithpager"

コード http://pastebin.com/EFQLzRej

================================================== ================ 編集/更新:

これから学んだこと

そのようなエラーが発生するたび

1.使用されているアクティビティの種類を確認します。これは、単純なandroid.appアクティビティ、AppCompatActivity、ActionBarActivityなどです。

2.拡張されたアクティビティタイプがcompatカテゴリに該当するかどうかを確認します

例android.appベースのActivity / FragmentはappCompatタイプではありませんが、android.support.v4.app.Fragmentまたはandroid.support.v4.app.ActivityCompatはappCompatベースです

appCompatに該当する場合はgetSupportActionBar()を使用します。android.appタイプの場合はgetActionBar()を使用できます

3.マニフェストファイルで問題のアクティビティに適用されているテーマを確認します

例:マニフェストファイルで、適用されるテーマがandroid:theme = "@ android:style / Theme.Holo.Dialog"の場合、getActionBar()が機能します

ただし、マニフェストのアクティビティに適用されるテーマがandroid:theme = "@ style / Theme.AppCompat.Light"の場合は、getSupportActionBar()を使用する必要があります


3
やってみgetSupportActionbar()ますか?
Kingfisher Phuoc 2015年

私は既にコードでgetSupportActionbarを使用しています
ViVekH

App compatテーマを使用しましたか?さらに支援が必要な場合は、ここにアクティビティ宣言とともにマニフェストを投稿してください。
Kingfisher Phuoc 2015年

もう一度コードを見てください。私はsupportActionBarあなたのテーマで(ヌルではなく)得ることができます。すべてgetActionBarをに置き換えましたgetSupportActionBarか?もう1つ、新しいエラーログを更新する必要があります。
Kingfisher Phuoc 2015年

1
私はあなたのコードを見ました。実際、あなたはまだあなたの中で使用getActionBar()していますMainActivity...それを確認してに変更してくださいgetSupportActionBar
Kingfisher Phuoc 2015年

回答:


151

あなたのコードがスローしていcom.example.tabwithslidingdrawer.MainActivity.onCreate(MainActivity.java:95)ます:

        // enabling action bar app icon and behaving it as toggle button
        getActionBar().setDisplayHomeAsUpEnabled(true);
        getActionBar().setHomeButtonEnabled(true);

問題はかなり単純です。あなたActivityは新しいから継承していandroid.support.v7.app.ActionBarActivityます。のgetSupportActionBar()代わりにへの呼び出しを使用する必要がありgetActionBar()ます。

上記のコードの65行目付近を見ると、すでに実行していることがわかります。

        actionBar = getSupportActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
        // TODO: Remove the redundant calls to getSupportActionBar()
        //       and use variable actionBar instead
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeButtonEnabled(true);

次に、87行目を下に下げて、同じことがわかったように見えます。

        getSupportActionBar().setTitle(
                        Html.fromHtml("<font color=\"black\">" + mTitle + " - "
                                        + menutitles[0] + "</font>"));
        // getActionBar().setTitle(mTitle +menutitles[0]);

コメントアウトした方法に注意してくださいgetActionBar()


8
ただのメモ:のandroid.support.v7.app.ActionBarActivityために廃止されましたandroid.support.v7.app.AppCompatActivity。しかし、問題は同じです。
ファンクショナル

1
フラグメント内、こちらを
jacktrades

29

誰かがandroid.app.ActionBarandroid.app.Activityを使用したい場合は、たとえばstyles.xmlでアプリのテーマを変更する必要があります。

<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">

問題は、AppCompatテーマを使用している可能性があることです。

一方、android.support.v7.app.ActionBarを使用したい場合にAppCompatActivityでアクティビティを拡張するには、AppCompatテーマを使用してこの問題を回避する必要があります。次に例を示します。

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">

お役に立てれば。


この回答のAppCompatActivityようにActivity、の代わりにから拡張することもできます
キース

確かに@Keith。AppCompatテーマを使用する場合は、AppCompatActivityを使用する必要があります。そうしないと、同じ非互換性の問題が発生します。
crubio '20

@crubioありがとう!
Kumaresh Babu NS、

18

appcompatActivity拡張するときは、

this.getSupportActionBar().setDisplayHomeAsUpEnabled(true);

ActionBar拡張する場合は、次を使用します

this.getActionBar().setDisplayHomeAsUpEnabled(true);

ツールバー/アクションバーを初期化した後、oncreateでこの関数を呼び出すことを忘れないでください


12

あなたがやりたいことはgetActivity()をキャストすることだと思います。例えば:

((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);

これは、新しいサポートライブラリで行う必要があることです。AppCompatActivityはActionBarActivityを置き換えました。


7

ここをチェックしてみてください

res >>値>> styles.xml

このようなコードがないことを確認してください

<item name="windowActionBar">false</item>

そのようなコードがある場合は、しばらく無効にするか、消去することができます


思い出させてくれてありがとう!:DIも残っており<item name="windowNoTitle">true</item>、削除する必要がありました。
gujci

私にとって、うまくいったのはAndroidManifest.xmlのタグandroid:theme="@style/AppTheme.NoActionBar"から削除することでした<avticity>
Smaily Carrilho

4

AppCompatActivityを使用する場合は呼び出す必要があります

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

getSupportActionBar()

public class PageActivity extends AppCompatActivity {
     @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_item);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        this.getSupportActionBar().setDisplayHomeAsUpEnabled(false);

    }
}

2

上ボタンは通常、低レベルのアクティビティに対してアクティブ化されます。マニフェストにはMainActivityのみが表示されます。メインアクティビティの[上へ]ボタンをアクティブにするのは意味がないと思います。アクティビティを作成し、マニフェストにparentActivityName属性を追加します。次に、アクティビティのonCreateメソッドの上ボタンをアクティブにします。
これは役立つはずです。
https://developer.android.com/training/appbar/up-action.html


2

私の場合はstyles.xml、間違った親テーマを設定したことが原因です。つまり、NoActionBarテーマはもちろんgetSupportActionbar()nullです。

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">

それを別の何かに変更して修正しました:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">

2

これがうまくいくことを願って、私のコードはうまくいきます

Toolbar toolbar = findViewById(R.id.toolbar1);
setSupportActionBar(toolbar);

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setTitle("");

1

あなたの活動のこの行で:

super.onCreate(savedInstanceState);
setContentView(R.layout.Activity_Main);

これを使って:

super.onCreate(savedInstanceState);
setContentView(R.layout.*);

* あなたの活動は


1

私の場合、同じエラーがありましたが、ツールバーを宣言しなかったのが私の間違いでした。

そのため、getSupportActionBarを使用する前に、ツールバーを見つけてactionBarを設定する必要がありました。

    appbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(appbar);

    getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_nav_menu);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

1

この質問は古いものです。しかし、これはこの問題を提示する多くの人を助けることができます。

この問題を解決するには、無効点がないかどうかを確認します。次に、対応する構成を適用します。

if(getSupportActionBar() != null){
 getSupportActionBar().setDisplayHomeAsUpEnabled(true);
 getSupportActionBar().setHomeButtonEnabled(true);
}

1

android.app.ActionBarとandroid.app.Activityを使用している場合は、アプリケーションタグでアプリのテーマを変更する必要があります。

< application
     android:theme="@android:style/Theme.Holo.Light">

0

BaseActivityとそれを継承する子を持つ他のユーザーは、何かを行う前に必ずsuper.onCreate()が呼び出されるようにしてください。後でsuper.onCreate()を呼び出すと、古いアクティビティが機能します。

子供は活動を拡張します-あなたが何かをした後にスーパーを呼び出すことができます

@Override
protected void onCreate(Bundle savedInstanceState)
{
    getActionBar().setDisplayHomeAsUpEnabled(true);
    super.onCreate(savedInstanceState);

子がAppCompatActivityを拡張-最初にスーパーを呼び出さなければならない

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState); //do this first
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

0

この問題が引き続き発生する場合は、AndroidManifest.xmlファイルで問題が解決されました。それが言うところ<activity android:name=".MainActivity" android:theme="@style/AppTheme.NoActionBar">、あなたは削除する必要がNoActionBarそれを作る、<activity android:name=".MainActivity" android:theme="@style/AppTheme">NoActionBarと、それはあなたがMainActivity.javaの内側に1を呼び出すアクションバーを望んでいるかどうか、アプリのdoesntのノウハウを設定しているため、


0

同じエラーが発生しました。デフォルトのツールバー(toolbar.xml)のテンプレートを作成し、別のビューで折りたたみ可能なツールバーを作成しました。

ユーザーの情報(whatsappなど)を表示するビューに折りたたみ可能なツールバーを追加する必要がありましたが、メソッドfindViewByIdはデフォルトのツールバー(idツールバー)を参照し、折りたたみ可能なツールバー(idツールバーも)を参照していませんでした。両方のツールバーに同じIDがあるため、アクティビティにアクセスしようとすると、アプリがクラッシュしてエラーが表示されました。

折りたたみ可能なツールバーのIDをid:col_toolbarに変更してエラーを修正し、エラーは解消され、アプリは完全に機能しました


0

これを試してみてください。うまくいくと思います。

    Toolbar toolbar = findViewById(R.id.toolbar1);
    setSupportActionBar(toolbar);

    mDrawerLayout = findViewById(R.id.drawer_layout);
    mDrawerLayout = findViewById(R.id.drawer_layout);
    mDrawerLayout.setDrawerShadow(R.drawable.rectagle_with_black_outer,
            GravityCompat.START);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setHomeButtonEnabled(true);

    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
            toolbar, R.string.navigation_drawer_close,
            R.string.navigation_drawer_close) {
        public void onDrawerClosed(View view) {
            invalidateOptionsMenu();
        }

        public void onDrawerOpened(View drawerView) {
            invalidateOptionsMenu();
        }
    };

0

Oncreateメソッドでこれを行うのに最適なソリューション

 ActionBar actionBar = getSupportActionBar();

        if(actionBar != null){
            actionBar.setDisplayHomeAsUpEnabled(true);
        }

続いて新しいクラス

@Override
    public boolean onOptionsItemSelected(MenuItem item) {

        int id = item.getItemId();

        if(id == android.R.id.home){
            onBackPressed();
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

このコードスニペットは、問題の解決に役立つ理由と方法の説明を含め、質問に回答する場合がありますが、回答の品質と寿命が向上します。参照してください。私は良い答えを書くにはどうすればよいですか?
アンモラル

0

後に追加してください Toolbar

Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().hide();

0

私はAndroidアプリ開発の初心者です。私はこのエラーに直面し、それを修正するためにほぼ5時間を費やしました。最後に、私は以下がこの問題の根本的な原因であることを発見しました。将来この問題に再び直面する人がいたら、これを読んでください。

親テーマをデフォルト設定のからに変更する必要があった、ビデオ背景付きのホームアクティビティを作成しようとしていましTheme.AppCompat.Light.DarkActionBarTheme.AppCompat.Light.NoActionBar。これはHomeアクティビティでは問題なく機能しましたが、onclicklistenerを使用して新しいボタンを設定し、アクションバーにカスタムテキストを設定した別のアクティビティに移動すると、このエラーがスローされます。

つまり、2つのテーマを作成し、それらを次のようにアクティビティに割り当てました。

Theme.AppCompat.Light.DarkActionBar - for Activities with Action Bar (default)
Theme.AppCompat.Light.NoActionBar - for Activities without Action Bar 

エラーを修正するために、次の変更を行いました。

  1. styles.xmlでテーマを定義する

    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
    
    <style name="DefaultTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
  2. のアクティビティをそれぞれのテーマに関連付ける AndroidManifest.xml

    <activity android:name=".Payment"
        android:theme="@style/DefaultTheme"/>
    
    <activity android:name=".WelcomeHome"
        android:theme="@style/AppTheme.NoActionBar">

0

このエラーが発生した場合

"java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.appcompat.app.ActionBar.setTitle (java.lang.CharSequence)' on a null object reference. "

使うだけ

setSupportActionBar (toolbar). 

-1

そのようなエラーが発生したときはいつでも。次のものをチェックしてみてください

  1. 使用されているアクティビティの種類を確認します。これは、単純なandroid.appアクティビティ、AppCompatActivity、ActionBarActivityなどです。

  2. 拡張されたアクティビティタイプがcompatカテゴリに該当するかどうかを確認します

例android.appベースのActivity / FragmentはappCompatタイプではありませんが、android.support.v4.app.Fragmentまたはandroid.support.v4.app.ActivityCompatはappCompatベースです

appCompatに該当する場合はgetSupportActionBar()を使用します。android.appタイプの場合はgetActionBar()を使用できます

  1. マニフェストファイルで問題のアクティビティに適用されているテーマを確認してください

例:マニフェストファイルで、適用されるテーマがandroid:theme = "@ android:style / Theme.Holo.Dialog"の場合、getActionBar()が機能します

ただし、マニフェストのアクティビティに適用されるテーマがandroid:theme = "@ style / Theme.AppCompat.Light"の場合は、getSupportActionBar()を使用する必要があります


-1

新しいツールバーを作成した場合は、適用して、メソッドsetSupportActionBar()を適用したことを確認します。それは間違いなくあなたを助けます


-3

これを試してください:

                getSupportActionBar().setDisplayHomeAsUpEnabled(true);
                getSupportActionBar().setHomeButtonEnabled(true);
                actionBar = getSupportActionBar();
                actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);

これの代わりに:

actionBar = getSupportActionBar();
                actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);

                getSupportActionBar().setDisplayHomeAsUpEnabled(true);
                getSupportActionBar().setHomeButtonEnabled(true);

変数のgetSupportActionBar()結果がすでにある場合に呼び出すのはなぜactionBarですか?両方の亜種は悪いです。
2015

getSupportActionBar();を変更します。to actionBar = getSupportActionBar(); それは同じだ!!!!足を振ります!!!!!
Cabezas

違いはありません
crubio 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.