getActionBar () renvoie null


176

J'ai un problème étrange. Je crée une application avec targetdk 13.

Dans la méthode onCreate de mon activité principale, j'appelle getActionBar()pour configurer ma barre d'actions. Cela fonctionne bien lors de l'exécution sur l'émulateur Android 3.2, mais lors de l'utilisation d'Android 3.0 et 3.1, la getActionBar()méthode renvoie null.

Je trouve cela extrêmement étrange et je ne vois aucune raison pour laquelle ce serait le cas. Est-ce un bogue avec les émulateurs ou dois-je faire quelque chose pour m'assurer que mon application dispose d'une barre d'action?

SOLUTION: Je pense avoir trouvé une solution à ce problème. Je n'utilisais pas setContentView pour définir une disposition pour l'activité. Au lieu de cela, j'utilisais fragmentTransaction.add(android.R.id.content, mFragment, mTag)pour ajouter un fragment à l'activité. Cela fonctionnait bien dans la version 3.2, mais dans les versions antérieures en nid d'abeille, la barre d'action n'est apparemment pas définie si vous n'utilisez pas setContentView dans la onCreate()méthode. Je l'ai donc corrigé en utilisant la setContentView()méthode de ma onCreate()méthode et en lui fournissant simplement une disposition contenant un FrameLayout vide. Je peux toujours utiliser la fragmentTransaction.add(android.R.id.content, mFragment, mTag)méthode de la même manière qu'avant.

Ce n'est pas la meilleure solution, mais cela fonctionne.


comme vous l'avez souligné en répondant à un autre message, vous avez besoin d'un thème Holo. Vous ne pensez pas que vous avez spécifié votre thème holo uniquement dans un dossier v13 res? Désolé si cela semble trop évident.
PJL

Non, c'était aussi ma première pensée, mais ce n'est pas le cas. Merci pour votre réponse.
Christian Skogsberg

Réponses:


226

Peut utiliser à la getSupportActionBar()place de la getActionBar()méthode.


hors de tout d'ici, cela l'a fait pour moi!
msysmilu

16
merci, j'utilisais "android.support.v7.app.ActionBarActivity" donc cela l'a fait pour moi.
velval

1
Après 2 heures de recherche! Changer pour getSupportActionBar () et android.support.v7.app.ActionBarActivity le résout enfin pour moi.
FacePalm

C'est la solution au problème.
zygimantus

46

Si vous utilisez la bibliothèque de support

import android.support.v7.app.ActionBarActivity;

public class MainActivity extends ActionBarActivity {

utilisation getSupportActionBar() au lieu degetActionBar()

* Mettre à jour:

La classe ActionBarActivity est désormais obsolète:

import android.support.v7.app.ActionBarActivity;

Je recommande d'utiliser:

import android.support.v7.app.AppCompatActivity

within android.support.v7.app: ActionBarActivityobsolète À utiliser à la android.support.v7.app.AppCompatActivityplace.
A. Petrov

35

Vous devez définir le type de fenêtre comme barre d'actions avant que l'activité ne rende sa vue.

utilisation

requestWindowFeature(Window.FEATURE_ACTION_BAR);

avant d'appeler la méthode setContentView ().


Si getSupportActionBar () ne fonctionne pas, cela fonctionne comme un charme
Ashwin Balani

35
  1. si vous utilisez android.support.v7.app.AppCompatActivity

    la classe publique HomeActivity étend AppCompatActivity {

Ensuite, vous devriez utiliser android.support.v7.app.ActionBar

  ActionBar ab = getSupportActionBar();
  1. Si vous utilisez android.support.v4.app.FragmentActivity

    classe publique HomeActivity étend FragmentActivity {

alors vous devriez utiliser android.app.ActionBar

    ActionBar ab = getActionBar();
  1. Si vous utilisez android.support.v7.app.ActionBarActivity

    La classe publique HomeActivity étend ActionBarActivity {

vous devriez utiliser android.support.v7.app.ActionBar

   ActionBar ab = getSupportActionBar();

Excellente réponse, s'attaque à la confusion !!
sud007

31

J'ai rencontré le problème ci-dessus où la getActionBar()méthode retourne null. J'appelais getActionBar()après avoir réglé le setContentView()et toujours son retour a null.

J'ai résolu le problème en définissant la version min-sdk dans le fichier Manifest Android qui manquait initialement. <uses-sdk android:minSdkVersion="11" />


4
Cela m'a fait gagner beaucoup de temps! Toute personne utilisant l'exemple d'application Bluetooth Chat dans le SDK Android doit utiliser ce correctif. Le manifeste de l'application néglige d'inclure l'espace de noms «android:» dans sa balise minSdkVersion et ne s'enregistre donc pas. L'ajout de l'espace de noms corrige une erreur avec la barre d'action introuvable. Sloppy, Google!
Nick

En fait, vous devrez peut-être simplement spécifier targetSdkVersion. Vous pouvez exécuter avec une minSdkVersion inférieure si vous utilisez la bibliothèque compat, mais targetSdkVersion détermine le comportement.
William

Génial!! C'est ce que je cherchais.
swiftBoy

<uses-sdk android: minSdkVersion = "11" /> a résolu mon problème merci
Majid

27

ActionBar a besoin du thème de l'application ou de l'activité pour avoir un titre d'application. Assurez-vous que vous n'avez pas défini votre application ou activité comme Theme.NOTITLE.

<application
    android:name="com.xxx.yyy"
    android:debuggable="false"
    android:icon="@drawable/icon"
    android:label="@string/app_name"
    android:theme="@style/Theme.NoTitle"> // remove this line if you have this in your code


<activity
        android:name="com.xxx.yyy.Activity"
        android:configChanges="orientation|keyboardHidden|screenSize"
        android:theme="@style/Theme.NoTitle"  // remove this line if you have in your code
        android:windowSoftInputMode="adjustResize|stateHidden" > 

19
import android.support.v7.app.AppCompatActivity;

puis

extends AppCompatActivity

puis utilisez

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

résout mon problème dans l'exemple du tiroir de navigation de google.
Weishi Zeng

Bonne solution, mais pour ceux qui l'implémenteront, il y aura très probablement des erreurs basées sur la compatibilité. Si vous le faites, assurez-vous de vérifier vos importations sur android.support.v4.app.FragmentTransaction au lieu de simplement android.app.FragmentTransaction et android.support.v7.app.ActionBar au lieu de android.app.ActionBar
Serj Ardovic

18

Cette réponse est tardive, mais peut être utile à toute personne qui arrive de Google: vous devrez peut-être déclarer

<item name="android:windowActionBar">true</item>

dans votre styles.xml . Cela semble falseêtre la valeur par défaut. Vous devez également être sur l'API 11 ou une version ultérieure.

Plus de détails peuvent être trouvés dans la documentation ici . Plus précisément, citez:

Conseil: Si vous disposez d'un thème d'activité personnalisé dans lequel vous souhaitez supprimer la barre d'actions, définissez la propriété de style android: windowActionBar sur false. Cependant, si vous supprimez la barre d'action à l'aide d'un thème, la fenêtre n'autorisera pas du tout la barre d'action, vous ne pourrez donc pas l'ajouter plus tard. L'appel de getActionBar () renverra null.


11

J'ai eu le même problème et l'une des solutions était d'utiliser setContentView()avant d'appeler getActionBar().

Mais il y avait une autre chose qui résolvait le problème. J'ai spécifié le thème de l'application @android:style/Theme.Holo.Light.

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@android:style/Theme.Holo.Light" >
    ...
</application>

Je pense que n'importe quel thème, qui a <item name="android:windowActionBar">true</item>dedans, peut être utilisé.


Merci, ça marche pour moi. Dans mon cas, la méthode getActionBar () a également renvoyé null et j'ai pu la résoudre en changeant le style de thème en Theme.Holo.Light. Avec d'autres thèmes (par exemple Theme.AppCompat), il semble que l'ActionBar n'est pas active, donc sa valeur est nulle.
harrakiss

10

La raison principale en est l'utilisation de thèmes qui ne prennent pas en charge ActionBar:

Dans le fichier manifeste, ajoutez ce qui suit dans votre activité cible ou dans l'élément d'application (si vous souhaitez unifier le thème sur l'ensemble de l'application)

Exemples de thèmes qui soutiennent la barre d'action "Theme.AppCompat.Light"ou "Theme.Holo.Light"...

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

Il est préférable de mettre tous les styles styles.xmlet de les utiliser partout en utilisant "@style/themName"pour que le précédent soit

android:theme="@style/AppTheme"

et styles.xml aura les éléments suivants:

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

Conseils:

  • Certains thèmes ne peuvent pas être utilisés dans les anciens SDK, comme ceux qui "@android:style/Theme.Holo.Light.DarkActionBar"ne sont pas pris en charge avant la version 14 des SDK.
  • Pour permettre à votre application de prendre en charge la version spécifique minimale du SDK, vous pouvez ajouter l' <app>élément suivant sous :

    <uses-sdk android:minSdkVersion="14" />
  • Pour spécifier la version minimale du SDK dans AndroidStudio, vous pouvez utiliser le fichier Gradle de l'application.

    android{
      defaultConfig{
        minSdkVersion 14
        targetSdkVersion 21
      }
    }

mais que dois-je faire pour prendre en charge le niveau d'API 9-13, au cas où j'utiliserais Theme.Holo.Light.DarkActionBar
Sid

8

J'ai rencontré ce problème. Je vérifiais le numéro de version et n'activais la barre d'action que si elle est supérieure ou égale à Honeycomb, mais elle retournait null. J'ai trouvé la raison et la cause principale que j'avais désactivé le style Holo Theme dans style.xml dans le dossier values-v11.


J'ai résolu mon problème en utilisant Holo Theme comme thème parent de mon AppTheme.
Bharat Dodeja

7

accédez au fichier AndroidManifest.xml et remplacez

android: theme = "@ style / AppTheme"

by 

android: theme = "@ android: style / Theme.Holo.Light.DarkActionBar"



4

Dans mon cas, j'avais ceci dans mon code qui ne fonctionnait pas:

@Override
protected void onCreate(Bundle savedInstanceState) {
    context = getApplicationContext();

    requestWindowFeature(Window.FEATURE_ACTION_BAR);

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);
}

Puis j'ai joué avec l'ordre du code:

@Override
protected void onCreate(Bundle savedInstanceState) {
    requestWindowFeature(Window.FEATURE_ACTION_BAR);

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    context = getApplicationContext();
}

Et ça a marché!

Conclusion: requestWindowFeature devrait être la première chose que vous appelez dans la méthode onCreate.


3

J'ai eu le même problème. Il a été résolu en modifiant le thème de l'application dans styles.xml

Avant

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">

Après

<!-- Base application theme. -->
<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">

2

Une chose que je voulais ajouter puisque je viens de rencontrer ceci, si vous essayez de getActionBar () sur une activité qui a un parent, il retournera null. J'essaie de refactoriser le code où mon activité est contenue dans un ActivityGroup, et il m'a fallu quelques minutes pour aller "oh duh" après avoir examiné la source de la création d'une ActionBar dans la source.


pourriez-vous publier votre solution pour les groupes d'activités?
Anthea

Ma solution d'après ce dont je me souviens est que j'ai refactoré mon code pour ne pas utiliser de groupes d'activités. Désolé, je n'ai pas d'extraits de code :(
C Nick

Ce n'est pas vraiment une solution; plus d'un commentaire. Mais très utile!
Kato

1

Je le résous par ces changements:

  1. changement de minifest android:theme="@android:style/Theme.Holo.Light" >
  2. ajouter à la classe extends ActionBarActivity
  3. ajouter l'importation à la classe import android.support.v7.app.ActionBarActivity

1

Pour ajouter aux autres réponses:

Assurez-vous d'appeler setActionBar()ou setSupportActionBar()dans votre onCreate()méthode avant d'appeler legetActionBar() :

Définissez une barre d'outils dans votre activity.xml, puis dans le onCreate ():

Toolbar toolbar = (Toolbar) findViewById(R.id.my_toolbar);
setSupportActionBar(toolbar);
// Now you can use the get methods:
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

0

Je sais que je suis en retard à la fête (et que je suis nouveau sur Android) sur cette question, mais j'ai trouvé les informations ici très utiles et j'ai pensé que je devrais ajouter les résultats de mes propres efforts pour faire fonctionner ActionBar comme je le voulais au cas où d'autres comme moi viendraient chercher de l'aide.

J'ai un widget qui est une fenêtre flottante sans titre de fenêtre. J'utilise un thème de style pour implémenter android:windowIsFloating, android:backgroundDimEnabledetandroid:windowNoTitle . Le widget fonctionnait bien jusqu'à ce que je veuille ajouter un bouton qui appelait un pager de fragment avec plusieurs pages de fragment de liste et utilisait l'ActionBar. Il planterait sur l'activité du pager avec une exception de pointeur nul. Je l'ai réduit à l'ActionBar étant nul. Suite aux découvertes des personnes précédentes qui ont contribué à ce fil, j'ai supprimé mon thème du fichier manifeste et l'ActionBar fonctionnait bien, mais maintenant ma fenêtre flottait plus (elle était en plein écran) et elle avait un titre de page que je ne voulais pas.

Des recherches plus poussées m'ont conduit au guide de formation de l'API Styles and Themes qui m'a conduit à une solution. J'ai découvert que je pouvais ajouter mon thème personnalisé à des activités individuelles dans le fichier manifeste alors qu'avant je l'appliquais à l'application. Toutes mes fenêtres ont maintenant l'apparence souhaitée.


0

Essayez d'étendre votre classe Activity à partir d'ActionBarActivity. Cela a résolu le problème pour moi. Faites quelque chose comme ceci:

public class MyActivity extends ActionBarActivity
{
  . . .

Dans mon cas, la classe ne s'étendait qu'à partir de l'activité.


0

Cela peut également aider certaines personnes.

Dans mon cas, c'était parce que je n'avais pas défini de contexte dans le menu.xml

Essaye ça:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.example.android.ActionBarActivity">

Au lieu de cela:

<menu xmlns:android="http://schemas.android.com/apk/res/android">

0

Vérifiez simplement l'implémentation du code source par un clic de commande:

    private void initWindowDecorActionBar() {
    Window window = getWindow();

    // Initializing the window decor can change window feature flags.
    // Make sure that we have the correct set before performing the test below.
    window.getDecorView();

    if (isChild() || !window.hasFeature(Window.FEATURE_ACTION_BAR) || mActionBar != null) {
        return;
    }

    mActionBar = new WindowDecorActionBar(this);
    mActionBar.setDefaultDisplayHomeAsUpEnabled(mEnableDefaultActionBarUp);

    mWindow.setDefaultIcon(mActivityInfo.getIconResource());
    mWindow.setDefaultLogo(mActivityInfo.getLogoResource());
}

requestWindowFeature (Window.FEATURE_ACTION_BAR); Correction de mon problème car j'ai vu que requestWindowFeature (Window.FEATURE_ACTION_BAR) échouait; le code est open source, utilisez-le !!


0

android.support.v7.app.ActionBar actionBar = getSupportActionBar();

fonctionne assez rapidement


3
Bien que ce code puisse répondre à la question, fournir un contexte supplémentaire sur la manière et / ou la raison pour laquelle il résout le problème améliorerait la valeur à long terme de la réponse.
Nic3500

0

Dans mon cas, j'ai simplement dû prolonger AppCompatActivityau lieu deActivity

    supportActionBar?.setDisplayHomeAsUpEnabled(true)

Classe d'exemple d'activité complète:

import android.os.Bundle import androidx.appcompat.app.AppCompatActivity

//class LocationFound : Activity() { <-----Does not seem to work with ActionBar in recent versions
class LocationFound : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_location_found)

        supportActionBar?.setDisplayHomeAsUpEnabled(true)
    } }

Sur les versions

    minSdkVersion 22
    targetSdkVersion 29
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.