Android-Fehler [Versuch, die virtuelle Methode 'void android.app.ActionBar' für eine Nullobjektreferenz aufzurufen]

97

Ich habe ein Codemodul, das Viewpager mit Navigationsleiste implementiert. Wenn ich jedoch den Code ausführe, wird der folgende Fehler angezeigt

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)

zeigt auf diese Linie

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

gesamter Code http://pastebin.com/u1K72fr7

Mein Manifest

<?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"

Code http://pastebin.com/EFQLzRej

================================================== =============== EDIT / UPDATE:

Was ich daraus gelernt habe

Wann immer ein solcher Fehler auftritt

1. Überprüfen Sie, welche Art von Aktivität verwendet wird, ob es sich um eine einfache android.app-Aktivität oder eine AppCompatActivity oder eine ActionBarActivity usw. handelt.

2. Überprüfen Sie, ob Ihr erweiterter Aktivitätstyp unter die kompatible Kategorie fällt

Beispiel android.app-basierte Aktivitäten / Fragmente sind keine appCompat-Typen, während android.support.v4.app.Fragment oder android.support.v4.app.ActivityCompat appCompat-basiert sind

Wenn es unter appCompat fällt, verwenden wir getSupportActionBar (). Andernfalls können wir für android.app-Typen getActionBar () verwenden.

3. Überprüfen Sie das Thema, das auf die betreffende Aktivität in der Manifestdatei angewendet wurde

Beispiel: Wenn in der Manifestdatei das angewendete Thema "android: theme =" @ android: style / Theme.Holo.Dialog "lautet, funktioniert getActionBar ()

Wenn das für die Aktivität im Manifest angewendete Thema jedoch wie folgt lautet: android: theme = "@ style / Theme.AppCompat.Light", müssen Sie getSupportActionBar () verwenden.

ViVekH
quelle
3
Versuchst du es getSupportActionbar()?
Eisvogel Phuoc
Ich benutze getSupportActionbar bereits in meinem Code
ViVekH
Haben Sie ein App-kompatibles Thema verwendet? Sie sollten Ihr Manifest mit Ihrer Aktivitätserklärung hier veröffentlichen, um weitere Hilfe zu erhalten.
Eisvogel Phuoc
Sie sollten sich Ihren Code noch einmal ansehen. Ich kann supportActionBarmit Ihrem Thema (nicht null) bekommen . Haben Sie alle getActionBardurch ersetzt getSupportActionBar? 1 weitere Sache, sollten Sie Ihr neues Fehlerprotokoll aktualisieren.
Eisvogel Phuoc
1
Ich habe mir deinen Code angesehen. Eigentlich verwenden Sie immer noch getActionBar()in Ihrem MainActivity... Überprüfen Sie es und wechseln Sie zu getSupportActionBar.
Eisvogel Phuoc

Antworten:

151

Ihr Code wirft auf 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);

Das Problem ist ziemlich einfach - Sie Activityerben vom Neuen android.support.v7.app.ActionBarActivity. Sie sollten einen Anruf getSupportActionBar()anstelle von verwenden getActionBar().

Wenn Sie oben in Zeile 65 Ihres Codes nachsehen, werden Sie feststellen, dass Sie dies bereits tun:

        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);

Und dann weiter unten in Zeile 87 sieht es so aus, als hätten Sie dasselbe herausgefunden:

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

Beachten Sie, wie Sie auskommentiert haben getActionBar().

Funktional
quelle
8
Nur eine Anmerkung: android.support.v7.app.ActionBarActivitywurde zugunsten von abgelehnt android.support.v7.app.AppCompatActivity. Aber das Problem ist das gleiche.
Funktional
1
In einem Fragment, siehe hier
Jacktrades
29

Wenn jemand android.app.ActionBar und android.app.Activity verwenden möchte, sollten Sie das App-Thema in styles.xml ändern , zum Beispiel:

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

Das Problem ist, dass Sie möglicherweise ein AppCompat-Design verwenden .

Wenn Sie andererseits android.support.v7.app.ActionBar verwenden und Ihre Aktivität mit AppCompatActivity erweitern möchten , müssen Sie ein AppCompat-Design verwenden , um dieses Problem zu vermeiden, zum Beispiel:

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

Hoffe das hilft.

Crubio
quelle
Sie können auch von AppCompatActivitystatt Activitywie in dieser Antwort erweitern .
Keith
Sicher @Keith, wenn Sie ein AppCompat-Design verwenden möchten, müssen Sie eine AppCompatActivity verwenden, da sonst das gleiche Inkompatibilitätsproblem auftritt.
Crubio
@crubio Danke!
Kumaresh Babu NS
18

Wenn Sie appcompatActivity erweitern, verwenden Sie

this.getSupportActionBar().setDisplayHomeAsUpEnabled(true);

und wenn Sie ActionBar erweitern, verwenden Sie

this.getActionBar().setDisplayHomeAsUpEnabled(true);

Vergessen Sie nicht, diese Funktion in oncreate aufzurufen, nachdem Sie die Symbolleiste / Aktionsleiste initialisiert haben

Fazal
quelle
12

Ich denke, was Sie tun möchten, ist getActivity () zu besetzen. Beispielsweise:

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

Dies müssen Sie mit den neuen Support-Bibliotheken tun. AppCompatActivity hat ActionBarActivity ersetzt.

ronwill06
quelle
7

Versuchen Sie hier zu überprüfen

res >> values ​​>> styles.xml

Stellen Sie sicher, dass es keinen solchen Code gibt

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

Wenn es solchen Code gibt, können Sie ihn für eine Weile deaktivieren oder löschen

Febrianto Nugroho
quelle
Danke für die Erinnerung !! : DI blieb auch drin <item name="windowNoTitle">true</item>, was entfernt werden musste.
Gujci
Für mich funktionierte das Entfernen android:theme="@style/AppTheme.NoActionBar"aus dem <avticity>Tag auf AndroidManifest.xml
Smaily Carrilho
4

Bei Verwendung muss AppCompatActivity aufrufen

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

Vor 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);

    }
}
Ahmad Aghazadeh
quelle
2

Die Aufwärts-Schaltfläche wird normalerweise für Aktivitäten auf niedriger Ebene aktiviert. In Ihrem Manifest sehe ich nur die Hauptaktivität. Ich halte es nicht für sinnvoll, den Up-Button für die Hauptaktivität zu aktivieren. Erstellen Sie eine Aktivität und fügen Sie dann im Manifest das Attribut parentActivityName hinzu. Aktivieren Sie dann die Schaltfläche nach oben in der onCreate-Methode der Aktivität.
Das sollte helfen.
https://developer.android.com/training/appbar/up-action.html

kiiya-natz
quelle
2

In meinem Fall liegt das daran styles.xml, dass das falsche übergeordnete Thema festgelegt wurde, dh das NoActionBarThema ist natürlich getSupportActionbar()null:

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

Es wurde in etwas anderes geändert, um es zu beheben:

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

Versuchen Sie diese Hoffnung, es wird funktionieren, mein Code funktioniert gut

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

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setTitle("");
Monzur
quelle
1

in dieser Zeile in Ihrer Aktivität:

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

benutze das:

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

* ist deine Tätigkeit

Soran
quelle
1

In meinem Fall hatte ich den gleichen Fehler, aber mein Fehler war, dass ich meine Symbolleiste nicht deklariert habe.

Bevor ich getSupportActionBar verwenden konnte, musste ich meine Symbolleiste finden und die Aktionsleiste festlegen

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

    getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_nav_menu);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
Jorge Casariego
quelle
1

Ich weiß, dass diese Frage etwas Altes ist. Dies kann jedoch vielen helfen, die dieses Problem darstellen.

Überprüfen Sie zur Lösung dieses Problems, ob ein Nullpunkt vorliegt. Wenden Sie dann die entsprechende Konfiguration an:

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

Wenn Sie android.app.ActionBar und android.app.Activity verwenden, sollten Sie das App-Thema im Anwendungs-Tag ändern:

< application
     android:theme="@android:style/Theme.Holo.Light">
Hasan Jamshaid
quelle
0

Stellen Sie für alle anderen Benutzer mit BaseActivity und einem untergeordneten Element sicher, dass super.onCreate () zuerst aufgerufen wird, bevor Sie etwas tun. Die alte Aktivität würde funktionieren, wenn Sie anschließend super.onCreate () aufrufen würden.

Kind erweitert Aktivität - könnte super anrufen, nachdem Sie Sachen gemacht haben

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

Kind erweitert AppCompatActivity - du musst zuerst super anrufen

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

Für diejenigen, die dieses Problem noch haben, wurde mein Problem in der Datei AndroidManifest.xml behoben. Wo es heißt <activity android:name=".MainActivity" android:theme="@style/AppTheme.NoActionBar">, müssen Sie es entfernen NoActionBarund <activity android:name=".MainActivity" android:theme="@style/AppTheme">erstellen, da die App mit der Einstellung NoActionBar nicht weiß, ob sie eine Aktionsleiste möchte, wenn Sie eine in MainActivity.java aufrufen

Evan H.
quelle
0

Ich habe einmal den gleichen Fehler erhalten, eine Vorlage für eine Standardsymbolleiste (toolbar.xml) erstellt und dann in einer anderen Ansicht eine reduzierbare Symbolleiste erstellt.

Ich musste die reduzierbare Symbolleiste zu einer Ansicht hinzufügen, die einige Informationen des Benutzers anzeigt (wie WhatsApp), aber die Methode findViewById verwies auf die Standardsymbolleiste (ID-Symbolleiste), nicht auf die reduzierbare Symbolleiste (auch ID-Symbolleiste). Ja, schrieb ich Die gleiche ID für beide Symbolleisten. Als ich versuchte, auf die Aktivität zuzugreifen, stürzte die App ab und zeigte mir den Fehler.

Ich habe den Fehler behoben, indem ich die ID der reduzierbaren Symbolleiste in id: col_toolbar geändert habe. Der Fehler ist verschwunden und meine App hat einwandfrei funktioniert

Carlos Fernando
quelle
0

Sie sollten diesen versuchen. Ich denke es wird funktionieren.

    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();
        }
    };
Itz Pkyadav
quelle
0

Die beste Lösung ist dies in Ihrer Oncreate-Methode

 ActionBar actionBar = getSupportActionBar();

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

gefolgt von einer neuen Klasse

@Override
    public boolean onOptionsItemSelected(MenuItem item) {

        int id = item.getItemId();

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

        return super.onOptionsItemSelected(item);
    }
Muyingo Steven
quelle
Obwohl dieses Code-Snippet möglicherweise die Frage beantwortet, einschließlich einer Erklärung, warum und wie es zur Lösung des Problems beiträgt, verbessert es die Qualität und Langlebigkeit Ihrer Antwort. Siehe Wie schreibe ich eine gute Antwort?
ammportal
0

Bitte nach hinzufügen Toolbar

Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().hide();
Md Selim
quelle
0

Ich bin neu in der Android App-Entwicklung. Ich habe diesen Fehler festgestellt und fast 5 Stunden damit verbracht, ihn zu beheben. Schließlich fand ich heraus, dass das Folgende die Hauptursache für dieses Problem war. Wenn jemand in Zukunft erneut mit diesem Problem konfrontiert wird, lesen Sie dies bitte durch.

Ich habe versucht , ein Haus Aktivitäten mit einem Video - Hintergrund zu erstellen, für die ich das übergeordnete Thema ändern musste von der Standardeinstellung Theme.AppCompat.Light.DarkActionBarzu Theme.AppCompat.Light.NoActionBar. Dies funktionierte gut für die Home-Aktivität, aber wenn ich eine neue Schaltfläche mit einem Onclicklistener einstelle, um zu einer anderen Aktivität zu navigieren, bei der ich einen benutzerdefinierten Text für die Aktionsleiste festgelegt habe, wird dieser Fehler ausgelöst.

Am Ende habe ich also zwei Themen erstellt und sie wie folgt den Aktivitäten zugewiesen.

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

Ich habe die folgenden Änderungen vorgenommen, um den Fehler zu beheben.

  1. Definieren der Themen in 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. Verknüpfen der Aktivitäten mit ihren jeweiligen Themen in AndroidManifest.xml

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

Wenn Sie auf diesen Fehler stoßen

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

Benutz einfach

setSupportActionBar (toolbar). 
kzncrda
quelle
-1

Wann immer ein solcher Fehler auftritt. Versuchen Sie, folgende Dinge zu überprüfen

  1. Überprüfen Sie, welche Art von Aktivität verwendet wird, ob es sich um eine einfache android.app-Aktivität oder eine AppCompatActivity oder eine ActionBarActivity usw. handelt.

  2. Überprüfen Sie, ob Ihr erweiterter Aktivitätstyp unter die kompatible Kategorie fällt

Beispiel android.app-basierte Aktivitäten / Fragmente sind keine appCompat-Typen, während android.support.v4.app.Fragment oder android.support.v4.app.ActivityCompat appCompat-basiert sind

Wenn es unter appCompat fällt, verwenden wir getSupportActionBar (). Andernfalls können wir für android.app-Typen getActionBar () verwenden.

  1. Überprüfen Sie das auf die betreffende Aktivität angewendete Thema in der Manifestdatei

Beispiel: Wenn in der Manifestdatei das angewendete Thema "android: theme =" @ android: style / Theme.Holo.Dialog "lautet, funktioniert getActionBar ()

Wenn das für die Aktivität im Manifest angewendete Thema jedoch wie folgt lautet: android: theme = "@ style / Theme.AppCompat.Light", müssen Sie getSupportActionBar () verwenden.

Pir Fahim Shah
quelle
-1

Wenn Sie eine neue Symbolleiste erstellt haben, überprüfen Sie, ob Sie die Methode setSupportActionBar () angewendet haben. es wird dir definitiv helfen

Mahendra Tupere
quelle
-3

Versuchen Sie Folgendes:

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

An Stelle von:

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

                getSupportActionBar().setDisplayHomeAsUpEnabled(true);
                getSupportActionBar().setHomeButtonEnabled(true);
Nahue Federico
quelle
Warum aufrufen, getSupportActionBar()wenn Sie bereits das Ergebnis in actionBarVariable haben? Beide Varianten sind schlecht.
Stan
Sie ändern getSupportActionBar (); to actionBar = getSupportActionBar (); Es ist das gleiche!!!! Schüttle ein Bein !!!!!
Cabezas
Es macht keinen Unterschied
Crubio