Erreur Android [Tentative d'invocation de la méthode virtuelle "void android.app.ActionBar" sur une référence d'objet nulle]


97

J'ai un module de code qui implémente viewpager avec le tiroir de navigation, cependant, lorsque j'exécute le code, j'obtiens l'erreur suivante

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)

pointe vers cette ligne

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

code entier http://pastebin.com/u1K72fr7

Mon manifeste

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

=================================================== ================ MODIFIER / METTRE A JOUR:

Ce que j'ai appris de ça

Chaque fois qu'une telle erreur se produit

1. Vérifiez quel type d'activité est utilisé, est-ce une simple activité android.app ou une AppCompatActivity ou une ActionBarActivity et ainsi de suite.

2. Vérifiez si votre type d'activité étendu relève de la catégorie compat

exemple Activity / Fragment basé sur android.app ne sont pas des types appCompat, alors que android.support.v4.app.Fragment ou android.support.v4.app.ActivityCompat sont basés sur appCompat

s'il relève de appCompat, nous utilisons getSupportActionBar () sinon pour les types android.app, nous pouvons utiliser getActionBar ()

3. Vérifiez le thème appliqué à l'activité en question dans le fichier manifeste

exemple: dans le fichier manifeste, si le thème appliqué est, par exemple, android: theme = "@ android: style / Theme.Holo.Dialog" getActionBar () fonctionnera

mais si le thème appliqué pour l'activité dans le manifeste est le suivant android: theme = "@ style / Theme.AppCompat.Light" alors vous devez utiliser getSupportActionBar ()


3
essayez-vous getSupportActionbar()?
Kingfisher Phuoc

J'utilise déjà getSupportActionbar dans mon code
ViVekH

Avez-vous utilisé le thème App compat? Vous devez publier votre manifeste avec votre déclaration d'activité ici pour obtenir de l'aide.
Kingfisher Phuoc le

vous devriez revoir votre code. Je peux obtenir supportActionBar(non nul) avec votre thème. Avez-vous tout remplacé getActionBarpar getSupportActionBar? Encore une chose, vous devriez mettre à jour votre nouveau journal des erreurs.
Kingfisher Phuoc

1
J'ai regardé votre code. En fait, vous utilisez toujours getActionBar()dans votre MainActivity... Vérifiez-le et passez à getSupportActionBar.
Kingfisher Phuoc

Réponses:


151

Votre code lance 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);

Le problème est assez simple: vous Activityhéritez du nouveau android.support.v7.app.ActionBarActivity. Vous devriez utiliser un appel à getSupportActionBar()au lieu de getActionBar().

Si vous regardez au-dessus de la ligne 65 de votre code, vous verrez que vous faites déjà cela:

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

Et puis plus bas autour de la ligne 87, il semble que vous ayez compris la même chose:

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

Remarquez comment vous avez commenté getActionBar().


8
Juste une note: android.support.v7.app.ActionBarActivitya été déconseillée au profit de android.support.v7.app.AppCompatActivity. Mais le problème est le même.
Funktional

1
À l'intérieur d'un fragment, voir ici
jacktrades

29

Si quelqu'un souhaite utiliser android.app.ActionBar et android.app.Activity, vous devez changer le thème de l'application dans styles.xml , par exemple:

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

Le problème est que vous utilisez peut-être un AppCompat thème .

D'autre part, si vous souhaitez utiliser android.support.v7.app.ActionBar et que vous étendez votre activité avec AppCompatActivity, vous devez utiliser un thème AppCompat pour éviter ce problème, par exemple:

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

J'espère que cela t'aides.


Vous pouvez également étendre de AppCompatActivityau lieu de Activity, comme dans cette réponse .
Keith

Bien sûr @Keith, si vous souhaitez utiliser un thème AppCompat, vous devez utiliser un AppCompatActivity sinon vous aurez le même problème d'incompatibilité.
crubio

@crubio Merci!
Kumaresh Babu NS

18

lorsque vous étendez appcompatActivity puis utilisez

this.getSupportActionBar().setDisplayHomeAsUpEnabled(true);

et lorsque vous étendez ActionBar, utilisez

this.getActionBar().setDisplayHomeAsUpEnabled(true);

n'oubliez pas d'appeler cette fonction dans oncreate après l'initialisation de la barre d'outils / barre d'action


12

Je pense que ce que vous voulez faire est de lancer getActivity (). Par exemple:

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

C'est ce que vous devez faire avec les nouvelles bibliothèques de support. AppCompatActivity a remplacé ActionBarActivity.


7

Essayez de vérifier ici

res >> valeurs >> styles.xml

assurez-vous qu'il n'y a pas de code comme celui-ci

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

s'il y a du code comme celui-là, vous pouvez le désactiver pendant un moment ou l'effacer


merci pour le rappel !! : DI a également laissé dedans <item name="windowNoTitle">true</item>, qui a dû être enlevé.
gujci

Pour moi, ce qui a fonctionné était de supprimer android:theme="@style/AppTheme.NoActionBar"du <avticity>tag sur AndroidManifest.xml
Smaily Carrilho

4

Lorsque vous utilisez AppCompatActivity, vous devez appeler

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

Avant 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

Le bouton Haut est généralement activé pour les activités de bas niveau. Dans votre manifeste, je ne vois que la MainActivity. Je ne pense pas qu'il soit logique d'activer le bouton haut de l'activité principale. Créez une activité, puis dans le manifeste, ajoutez l'attribut parentActivityName. Activez ensuite le bouton haut de la méthode onCreate de l'activité.
Cela devrait aider.
https://developer.android.com/training/appbar/up-action.html


2

Dans mon cas, c'est à cause du styles.xmlmauvais thème parent, c'est-à-dire que le NoActionBarthème getSupportActionbar()est bien sûr nul:

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

Je l'ai changé en quelque chose d'autre l'a corrigé:

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

2

Essayez ceci, j'espère que cela fonctionnera, mon code fonctionne bien

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

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

1

dans cette ligne dans votre activité:

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

utilisez ceci:

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

* est votre activité


1

Dans mon cas, j'ai eu la même erreur, mais mon erreur a été de ne pas déclarer ma barre d'outils.

Donc, avant d'utiliser getSupportActionBar, je devais trouver ma barre d'outils et définir l'actionBar

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

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

1

Je sais que cette question est ancienne. Mais cela peut aider beaucoup de ceux qui présentent ce problème.

Pour résoudre ce problème, vérifiez s'il existe un point de nullité. Appliquez ensuite la configuration correspondante:

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

1

Si vous utilisez android.app.ActionBar et android.app.Activity, vous devez changer le thème de l'application dans la balise d'application:

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

1

Si vous rencontrez cette erreur

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

Juste utiliser

setSupportActionBar (toolbar). 

0

Pour toute autre personne qui a une BaseActivity, et un enfant qui en étend, assurez-vous que super.onCreate () est appelée avant de faire quoi que ce soit. L'ancienne activité fonctionnerait si vous appeliez super.onCreate () par la suite.

L'enfant prolonge l'activité - pourrait appeler Super après avoir fait des choses

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

L'enfant étend AppCompatActivity - il faut d'abord appeler Super

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

0

Pour ceux qui rencontrent toujours ce problème, mon problème a été résolu dans le fichier AndroidManifest.xml. Là où cela est dit <activity android:name=".MainActivity" android:theme="@style/AppTheme.NoActionBar">, vous devez le supprimer NoActionBar, ce qui le rend <activity android:name=".MainActivity" android:theme="@style/AppTheme">, car avec NoActionBar défini, l'application ne sait pas si elle veut ou non une barre d'action lorsque vous en appelez une dans MainActivity.java


0

J'ai eu la même erreur une fois, j'ai créé un modèle pour une barre d'outils par défaut (toolbar.xml), puis dans une autre vue, j'ai créé une barre d'outils réductible.

J'avais besoin d'ajouter la barre d'outils réductible à une vue qui montre certaines informations de l'utilisateur (comme WhatsApp), mais la méthode findViewById faisait référence à la barre d'outils par défaut (barre d'outils id), pas à celle réductible (barre d'outils id également) oui, j'ai écrit le même identifiant dans les deux barres d'outils, donc lorsque j'ai essayé d'accéder à l'activité, l'application s'est plantée en me montrant l'erreur.

J'ai corrigé l'erreur en changeant l'id de la barre d'outils réductible en id: col_toolbar et l'erreur a disparu et mon application a parfaitement fonctionné


0

Vous devriez essayer celui-ci. Je pense que cela va fonctionner.

    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 meilleure solution est de le faire dans votre méthode Oncreate

 ActionBar actionBar = getSupportActionBar();

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

suivi d'une nouvelle classe

@Override
    public boolean onOptionsItemSelected(MenuItem item) {

        int id = item.getItemId();

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

        return super.onOptionsItemSelected(item);
    }

Bien que cet extrait de code puisse répondre à la question, y compris une explication de pourquoi et comment il aide à résoudre le problème améliore la qualité et la longévité de votre réponse. Voir Comment rédiger une bonne réponse?
ammportal

0

Veuillez ajouter après Toolbar

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

0

Je suis nouveau dans le développement d'applications Android. J'ai rencontré cette erreur et j'ai passé près de 5 heures à essayer de la réparer. Enfin, j'ai découvert que ce qui suit était la cause principale de ce problème et si quelqu'un doit à nouveau faire face à ce problème à l'avenir, veuillez le lire.

J'essayais de créer une activité domestique avec un arrière-plan vidéo, pour lequel j'ai dû changer le thème parent du paramètre par défaut de Theme.AppCompat.Light.DarkActionBarà Theme.AppCompat.Light.NoActionBar. Cela a bien fonctionné pour l'activité d'accueil, mais lorsque je définis un nouveau bouton avec un onclicklistener pour accéder à une autre activité, où j'avais défini un texte personnalisé dans la barre d'action, cette erreur est générée.

Donc, ce que j'ai fini par faire était de créer deux thèmes et de les assigner aux activités comme suit.

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

J'ai apporté les modifications suivantes pour corriger l'erreur.

  1. Définition des thèmes dans 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. Association des activités à leurs thèmes respectifs dans AndroidManifest.xml

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

-1

Chaque fois qu'une telle erreur se produit. Essayez de vérifier les éléments suivants

  1. Vérifiez quel type d'activité est utilisé, est-ce une simple activité android.app ou une AppCompatActivity ou une ActionBarActivity et ainsi de suite.

  2. Vérifiez si votre type d'activité étendu relève de la catégorie compat

exemple Activity / Fragment basé sur android.app ne sont pas des types appCompat, alors que android.support.v4.app.Fragment ou android.support.v4.app.ActivityCompat sont basés sur appCompat

s'il relève de appCompat, nous utilisons getSupportActionBar () sinon pour les types android.app, nous pouvons utiliser getActionBar ()

  1. Vérifiez le thème appliqué à l'activité en question dans le fichier manifeste

exemple: dans le fichier manifeste, si le thème appliqué est, par exemple, android: theme = "@ android: style / Theme.Holo.Dialog" getActionBar () fonctionnera

mais si le thème appliqué pour l'activité dans le manifeste est le suivant android: theme = "@ style / Theme.AppCompat.Light" alors vous devez utiliser getSupportActionBar ()


-1

si vous avez créé une nouvelle barre d'outils, puis appliquez, vérifiez que vous avez appliqué la méthode setSupportActionBar (); cela vous aidera sans aucun doute


-3

Essayez de faire ceci:

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

Au lieu de cela:

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

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

Pourquoi appeler getSupportActionBar()si vous avez déjà son résultat en actionBarvariable? Les deux variantes sont mauvaises.
Stan

Vous modifiez getSupportActionBar (); à actionBar = getSupportActionBar (); C'est le même!!!! Agiter une jambe!!!!!
Cabezas du

Ça ne fait aucune différence
crubio
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.