Errore Android [tentativo di richiamare il metodo virtuale "void android.app.ActionBar" su un riferimento a un oggetto nullo]


97

Ho un modulo di codice che implementa viewpager con il cassetto di navigazione, tuttavia, quando eseguo il codice ottengo il seguente errore

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)

indica questa linea

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

intero codice http://pastebin.com/u1K72fr7

Il mio manifesto

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

codice http://pastebin.com/EFQLzRej

================================================== ================ MODIFICA / AGGIORNAMENTO:

Cosa ho imparato da questo

Ogni volta che si verifica un tale errore

1. Verificare che tipo di attività viene utilizzata, è una semplice attività android.app o AppCompatActivity o ActionBarActivity e così via.

2. Controlla se il tuo tipo di attività esteso rientra nella categoria compatibile

esempio Activity / Fragment basato su android.app sono tipi non appCompat, mentre android.support.v4.app.Fragment o android.support.v4.app.ActivityCompat sono basati su appCompat

se rientra in appCompat usiamo getSupportActionBar () altrimenti per i tipi android.app possiamo usare getActionBar ()

3. Controlla il tema applicato all'attività in questione nel file manifest

esempio: nel file manifest se il tema applicato è dire android: theme = "@ android: style / Theme.Holo.Dialog" getActionBar () funzionerà

ma se il tema applicato per l'attività nel manifest è il seguente android: theme = "@ style / Theme.AppCompat.Light", allora devi usare getSupportActionBar ()


3
ci provi getSupportActionbar()?
Kingfisher Phuoc

Sto usando getSupportActionbar già nel mio codice
ViVekH

Hai usato il tema di compatibilità dell'app? Dovresti pubblicare il tuo Manifest con la tua dichiarazione di attività qui per ulteriore aiuto.
Kingfisher Phuoc

dovresti guardare di nuovo il tuo codice. Posso ottenere supportActionBar(non nullo) con il tuo tema. Hai sostituito tutto getActionBarcon getSupportActionBar? Un'altra cosa, dovresti aggiornare il tuo nuovo registro degli errori.
Kingfisher Phuoc

1
Ho guardato il tuo codice. In realtà, lo usi ancora getActionBar()nel tuo MainActivity... Controllalo e cambia in getSupportActionBar.
Kingfisher Phuoc

Risposte:


151

Il tuo codice sta lanciando 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);

Il problema è piuttosto semplice: la tua Activityeredita dal nuovo android.support.v7.app.ActionBarActivity. Dovresti usare una chiamata a getSupportActionBar()invece di getActionBar().

Se guardi sopra la riga 65 del tuo codice vedrai che lo stai già facendo:

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

E poi più in basso intorno alla linea 87 sembra che tu abbia capito lo stesso:

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

Nota come hai commentato getActionBar().


8
Solo una nota: android.support.v7.app.ActionBarActivityè stato deprecato a favore di android.support.v7.app.AppCompatActivity. Ma il problema è lo stesso.
Funktional

1
All'interno di un frammento, vedi qui
jacktrades

29

Se qualcuno vuole usare android.app.ActionBar e android.app.Activity , dovresti cambiare il tema dell'app in styles.xml , ad esempio:

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

Il problema è che potresti usare un AppCompat tema .

D'altra parte, se desideri utilizzare android.support.v7.app.ActionBar ed estendi la tua attività con AppCompatActivity , devi utilizzare un tema AppCompat per evitare questo problema, ad esempio:

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

Spero che questo ti aiuti.


Puoi anche estendere da AppCompatActivityinvece di Activity, come in questa risposta .
Keith

Certo @Keith, se vuoi usare un tema AppCompat devi usare un AppCompatActivity altrimenti avrai lo stesso problema di incompatibilità.
crubio

@crubio grazie!
Kumaresh Babu NS

18

quando estendi appcompatActivity, usa

this.getSupportActionBar().setDisplayHomeAsUpEnabled(true);

e quando estendi ActionBar, usa

this.getActionBar().setDisplayHomeAsUpEnabled(true);

non dimenticare di chiamare questa funzione in oncreate dopo aver inizializzato la barra degli strumenti / barra delle azioni


12

Penso che quello che vuoi fare sia lanciare getActivity (). Per esempio:

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

Questo è ciò che devi fare con le nuove librerie di supporto. AppCompatActivity ha sostituito ActionBarActivity.


7

Prova a controllare qui

res >> valori >> styles.xml

assicurati che non ci sia codice come questo

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

se ci sono codici del genere, puoi disabilitarli per un po 'o cancellarli


grazie per aver ricordato !! : Ho anche lasciato <item name="windowNoTitle">true</item>, che doveva essere rimosso.
gujci

Per me, ciò che ha funzionato è stato rimuovere android:theme="@style/AppTheme.NoActionBar"dal <avticity>tag su AndroidManifest.xml
Smaily Carrilho

4

Quando si usa AppCompatActivity deve chiamare

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

Prima 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

Il pulsante Su è solitamente attivato per le attività di basso livello. Nel tuo manifest vedo solo MainActivity. Non credo abbia senso attivare il pulsante su per l'attività principale. Crea un'attività, quindi nel manifest aggiungi l'attributo parentActivityName. Quindi attiva il pulsante su sul metodo onCreate dell'attività.
Questo dovrebbe aiutare.
https://developer.android.com/training/appbar/up-action.html


2

Nel mio caso è dovuto styles.xmlall'impostazione del tema principale sbagliato, ovvero il NoActionBartema ovviamente getSupportActionbar()è nullo:

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

Modificato in qualcos'altro lo ha risolto:

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

2

Prova questa speranza che funzioni, il mio codice funziona bene

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

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

1

in questa riga nella tua attività:

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

Usa questo:

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

* è la tua attività


1

Nel mio caso ho avuto lo stesso errore, ma il mio errore è stato di non aver dichiarato la mia barra degli strumenti.

Quindi, prima di usare getSupportActionBar ho dovuto trovare la mia barra degli strumenti e impostare la actionBar

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

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

1

So che questa domanda è qualcosa di vecchio. Ma questo può aiutare molti che presentano questo problema.

Per risolvere questo problema, controlla se c'è un punto di nullità. Quindi applica la configurazione corrispondente:

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

1

Se stai usando android.app.ActionBar e android.app.Activity dovresti cambiare il tema dell'app nel tag dell'applicazione:

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

1

Se incontri questo errore

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

Basta usare

setSupportActionBar (toolbar). 

0

Per chiunque abbia una BaseActivity e un figlio che si estende da essa, assicurati che super.onCreate () sia chiamato prima di fare qualsiasi cosa. La vecchia attività funzionerebbe se successivamente chiamassi super.onCreate ().

Il bambino estende l'attività - potrebbe chiamare super dopo che hai fatto qualcosa

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

Il bambino estende AppCompatActivity: devi chiamare super prima

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

0

Per coloro che hanno ancora questo problema, il mio problema è stato risolto nel file AndroidManifest.xml. Dove dice <activity android:name=".MainActivity" android:theme="@style/AppTheme.NoActionBar">, devi rimuoverlo NoActionBar, facendolo <activity android:name=".MainActivity" android:theme="@style/AppTheme">, perché con NoActionBar impostato l'app non sa se vuole o meno una barra delle azioni quando ne richiami una all'interno di MainActivity.java


0

Ho ricevuto lo stesso errore una volta, ho creato un modello per una barra degli strumenti predefinita (toolbar.xml) e poi in un'altra vista ho creato una barra degli strumenti comprimibile.

Ho richiesto di aggiungere la barra degli strumenti comprimibile a una vista che mostra alcune informazioni dell'utente (come whatsapp), ma il metodo findViewById faceva riferimento alla barra degli strumenti predefinita (barra degli strumenti id), non a quella comprimibile (anche barra degli strumenti id) sì, ho scritto lo stesso ID su entrambe le barre degli strumenti, quindi quando ho provato ad accedere all'attività l'app si è bloccata mostrandomi l'errore.

Ho corretto l'errore cambiando l'id della barra degli strumenti comprimibile in id: col_toolbar e l'errore è scomparso e la mia app ha funzionato perfettamente


0

Dovresti provare questo. Penso che funzionerà.

    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

La soluzione migliore è farlo nel tuo metodo Oncreate

 ActionBar actionBar = getSupportActionBar();

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

seguito da una nuova classe

@Override
    public boolean onOptionsItemSelected(MenuItem item) {

        int id = item.getItemId();

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

        return super.onOptionsItemSelected(item);
    }

Sebbene questo frammento di codice possa rispondere alla domanda, inclusa una spiegazione del perché e come aiuta a risolvere il problema, migliora la qualità e la longevità della risposta. Vedi Come scrivo una buona risposta?
ammportal

0

Si prega di aggiungere dopo Toolbar

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

0

Sono un nuovo nello sviluppo di app Android. Ho riscontrato questo errore e ho passato quasi 5 ore a cercare di risolverlo. Alla fine, ho scoperto che quanto segue era la causa principale di questo problema e se qualcuno dovesse affrontare nuovamente questo problema in futuro, ti preghiamo di leggere.

Stavo cercando di creare un'attività domestica con uno sfondo video, per il quale ho dovuto modificare il tema principale dall'impostazione predefinita di Theme.AppCompat.Light.DarkActionBaraTheme.AppCompat.Light.NoActionBar . Ha funzionato bene per l'attività Home, ma quando ho impostato un nuovo pulsante con un onclicklistener per passare a un'altra attività, dove avevo impostato un testo personalizzato sulla barra delle azioni, questo errore viene generato.

Quindi, quello che ho finito per fare è stato creare due temi e assegnarli alle attività come segue.

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

Ho apportato le seguenti modifiche per correggere l'errore.

  1. Definizione dei temi 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. Associazione delle attività ai rispettivi temi in AndroidManifest.xml

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

-1

Ogni volta che si verifica un tale errore. Prova a controllare le seguenti cose

  1. Controlla che tipo di attività viene utilizzata, è una semplice attività android.app o AppCompatActivity o ActionBarActivity e così via.

  2. Controlla se il tuo tipo di attività esteso rientra nella categoria compatibile

esempio Activity / Fragment basato su android.app sono tipi non appCompat, mentre android.support.v4.app.Fragment o android.support.v4.app.ActivityCompat sono basati su appCompat

se rientra in appCompat usiamo getSupportActionBar () altrimenti per i tipi android.app possiamo usare getActionBar ()

  1. Controlla il tema applicato all'attività in questione nel file manifest

esempio: nel file manifest se il tema applicato è dire android: theme = "@ android: style / Theme.Holo.Dialog" getActionBar () funzionerà

ma se il tema applicato per l'attività nel manifest è il seguente android: theme = "@ style / Theme.AppCompat.Light", allora devi usare getSupportActionBar ()


-1

se hai creato una nuova barra degli strumenti, applica verifica di aver applicato il metodo setSupportActionBar (); ti aiuterà sicuramente


-3

Prova a farlo:

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

Invece di questo:

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

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

Perché chiamare getSupportActionBar()se hai già il suo risultato in actionBarvariabile? Entrambe le varianti sono cattive.
Stan

Si modifica getSupportActionBar (); ad actionBar = getSupportActionBar (); È lo stesso!!!! Agita una gamba!!!!!
Cabezas

Non fa alcuna differenza
crubio
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.