web-dev-qa-db-fra.com

Comment corriger la méthode getActionBar peut produire une exception Java.lang.NullPointerException

J'utilise une barre d'outils comme barre d'action dans une activité. J'essaie d'ajouter la méthode getActionBar().setDisplayHomeAsUpEnabled(true); au fichier Activity.Java pour la navigation vers le haut pour les appareils plus anciens.

La méthode génère le message d'erreur suivant dans Android Studio:

L'appel de méthode peut produire une exception Java.lang.NullPointerException

La navigation vers le haut de la barre d’outils fonctionne bien sur les appareils plus récents ... maintenant, je cherche à savoir comment s’assurer que cela fonctionnera pour les appareils plus anciens . Veuillez conseiller.

De build.gradle:

dependencies {
   compile "com.Android.support:appcompat-v7:22.1.0"
}

De AndroidManifest.xml:

Android:theme="@style/Theme.AppCompat.NoActionBar.FullScreen" 

De styles.xml

<style name="Theme.AppCompat.NoActionBar.FullScreen" parent="AppTheme">
<item name="Android:windowNoTitle">true</item>
<item name="windowActionBar">false</item>
<item name="Android:windowFullscreen">true</item>

de Activity.Java

public class CardViewActivity extends AppCompatActivity {

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.cardviewinput);

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

    if (toolbar != null) {
        // Up navigation to the parent activity for 4.0 and earlier
        getActionBar().setDisplayHomeAsUpEnabled(true);
        toolbar.setNavigationIcon(R.drawable.ic_action_previous_item);
        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onBackPressed();
            }
        });
    }

}
67
AJW

En réalité, Android Studio ne vous affiche pas un "message d'erreur", c'est juste un avertissement.

Certaines réponses suggèrent l'utilisation d'une assertion, le runtime de Dalvik a assertion désactivé par défaut, vous devez donc l'activer pour qu'il puisse réellement faire quelque chose. Dans ce cas (l'assertion est désactivée), ce que vous faites est essentiellement de tromper Android Studio pour ne pas vous montrer l'avertissement. De plus, je préfère ne pas utiliser "assert" dans le code de production.

À mon avis, ce que vous devriez faire est très simple.

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

Update: Si vous utilisez la version de la barre de tâches de la bibliothèque d'assistance, remplacez getActionBar () par getSupportActionBar ().

if(getSupportActionBar() != null){
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
118
Adam Ghani

Tout d'abord, vous devez définir la barre d'outils en tant que support ActionBar . Ensuite, si vous êtes certain qu'il y sera tout le temps, déclarez-le simplement comme! = Null. Cela indiquera au compilateur qu'il ne sera pas nul, ainsi la vérification de zéro passe.

@Override
protected void onCreate(Bundle savedInstanceState)
{
   super.onCreate(savedInstanceState);
   setContentView(R.layout.cardviewinput);

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

   assert getSupportActionBar() != null;
   getSupportActionBar().setDisplayHomeAsUpEnabled(true); // it's getSupportActionBar() if you're using AppCompatActivity, not getActionBar()
}
34
Bogdan Zurac

Merci Andrew pour votre réponse ... Si vous avez un tiroir de navigation ou autre chose qui utilise getSupportActionBar (), vous devez ajouter assert getSupportActionBar ()! = Null;

Paix,

Exemple:

@Override
public void setTitle(CharSequence title) {
    mTitle = title;
    assert getSupportActionBar() != null;
    getSupportActionBar().setTitle(mTitle);
}
8
Scott

Essaye ça : 

private ActionBar getActionBar() {
    return ((AppCompatActivity) getActivity()).getSupportActionBar();
}
4
Shubham A.

Ce que j'ai fait est de remplacer la méthode getSupportActionBar() dans mon activité de base et d'ajouter une annotation @NonNull. Ainsi, dans l'activité de base, je ne reçois qu'un seul avertissement de peluchage sur la façon dont j'utilise l'annotation @NonNull pour quelque chose qui a une annotation @Nullable.

    @NonNull
    @Override
    public ActionBar getSupportActionBar() {
        // Small hack here so that Lint does not warn me in every single activity about null
        // action bar
        return super.getSupportActionBar();
    }
3
Catalin Morosan

ajouter assert getSupportActionBar() != null; avant getSupportActionBar().setDisplayHomeAsUpEnabled(true);

2
Pankaj K Sharma

J'ai créé une classe générique telle que:

public final class Cast
{
    private Cast() {}

    /**
     * Helps to eliminate annoying NullPointerException lint warning.
     */
    @Android.support.annotation.NonNull
    public static <T> T neverNull(T value)
    {
        return value;
    }
}

alors je peux l'utiliser pour tout appel avec l'avertissement NullPointerException pour lequel je suis sûr que cela n'arrivera jamais, par exemple.

final ActionBar actionBar = Cast.neverNull(getSupportActionBar());
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);

P.S. N'oubliez pas d'ajouter "com.Android.support:support-annotations" à votre fichier Gradle.

2
interrupt
 if(actionBar != null) {
  actionBar.setHomeButtonEnabled(true);
  actionBar.setBackgroundDrawable(ContextCompat.getDrawable(mContext,
                                  R.drawable.action_bar_gradient));
 }
0
Krishna

Si vous importez

Android.app.ActionBar 

vous devez utiliser getActionBar ()

et si vous importez

Android.support.v7.app.ActionBar

utilisez getSupportActionBar ()

0
MN. Vala

utiliser ce thème: Android:theme="@style/Theme.AppCompat.Light.NoActionBar"

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setTitle("Title");
setSupportActionBar(toolbar);
ActionBar actionBar = getSupportActionBar();
actionBar.setHomeButtonEnabled(true);
actionBar.setHomeAsUpIndicator(R.drawable.ic_action_previous_item);
actionBar.setDisplayHomeAsUpEnabled(true);
0
Surendran
  if(getSupportActionBar() != null){
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }
    OR

Remplacez le MainActivity extends AppCompatActivity par le public class MainActivity extends AppCompatActivity

0
MEGHA DOBARIYA

Essaye ça :

setSupportActionBar (toolbar);
if(getSupportActionBar () != null) {
assert getSupportActionBar () != null;
getSupportActionBar ().setDisplayHomeUpEnabled(true);
}

Notez que setSupportActionBar (barre d'outils) doit être avant getSupportActionBar ().

0
saibhaskar

il suffit de vérifier getSupportActionBar différent de null

    setSupportActionBar(toolbar);

    if(getSupportActionBar() != null) {
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setTitle("Daily Shopping List");
    }
0
Salahuddin

Vous pouvez également asserter la barre d’action pour ne pas avoir la valeur NULL.Ajoutez l’assertion avant d’appeler votre barre d’action comme suit

assert getSupportActionBar() != null;

L'extrait final ressemblerait donc à ce qui suit:

    setSupportActionBar((Toolbar) findViewById(R.id.toolbar));
    assert getSupportActionBar() != null;
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
0
RileyManda