web-dev-qa-db-fra.com

getActionBar () renvoie null

J'ai un problème étrange ... Je fais une application avec target 13. 

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

Je trouve cela extrêmement étrange et je ne vois pas pourquoi cela se produirait .. Est-ce un problème avec les émulateurs ou est-ce que je dois faire quelque chose pour 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 présentation de l'activité. J'utilisais plutôt 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 précédentes en nid d'abeille, la barre d'action n'est apparemment pas définie si vous n'utilisez pas setContentView dans la méthode onCreate() . Je l'ai donc corrigé en utilisant la méthode setContentView() dans ma méthode onCreate() et en lui fournissant simplement une présentation qui contenait un FrameLayout vide . Je peux toujours utiliser la méthode fragmentTransaction.add(Android.R.id.content, mFragment, mTag) de la même manière qu'auparavant.

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

169
Christian Skogsberg

Peut utiliser getSupportActionBar() au lieu de la méthode getActionBar().

208
Amir

Si vous utilisez la bibliothèque de support

import Android.support.v7.app.ActionBarActivity;

public class MainActivity extends ActionBarActivity {

utilisez getSupportActionBar() au lieu de getActionBar()

* Mettre à jour:

La classe ActionBarActivity now est obsolète:

import Android.support.v7.app.ActionBarActivity;

Je recommande d'utiliser:

import Android.support.v7.app.AppCompatActivity
46
Elenasys

Vous devez définir le type de fenêtre sous forme de barre d’action avant que l’activité ne rende sa vue.

utilisation 

requestWindowFeature(Window.FEATURE_ACTION_BAR);

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

33
kaushal trivedi

J'ai rencontré le problème ci-dessus où la méthode getActionBar() renvoie null. J'appelais la getActionBar() après avoir défini la setContentView() et le renvoie toujours null.

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

31
Rajendra
  1. si vous utilisez Android.support.v7.app.AppCompatActivity  

    classe publique HomeActivity étend AppCompatActivity {

Vous devriez alors utiliser Android.support.v7.app.ActionBar  

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

    public class HomeActivity étend FragmentActivity {

alors vous devriez utiliser Android.app.ActionBar

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

    classe publique HomeActivity étend ActionBarActivity {

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

   ActionBar ab = getSupportActionBar();
31
Hitesh Sahu

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 appelé votre application ou activité comme thème.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" > 
27
Himanshu Virmani

Cette réponse est en retard mais pourrait être utile à quiconque arrive de Google: vous devrez peut-être déclarer

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

dans votre styles.xml. Il semble que false puisse être la valeur par défaut. Vous devez également être sur API 11 ou supérieure.

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

Conseil: Si vous souhaitez supprimer un thème d'activité personnalisé, la barre d’action, définissez la propriété de style Android: windowActionBar sur faux. Cependant, si vous supprimez la barre d'action à l'aide d'un thème, le fichier window n'autorisera pas du tout la barre d'action, vous ne pouvez donc pas l'ajouter plus tard, appeler getActionBar () retournera null.

18
SK9
import Android.support.v7.app.AppCompatActivity;

puis

extends AppCompatActivity

puis utiliser

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
18
Abilash Rajasekaran

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

Dans le fichier manifeste, ajoutez les éléments suivants dans votre activité cible ou dans votre élément d'application (si vous souhaitez unifier le thème dans l'ensemble de l'application).

Exemples de thèmes prenant en charge 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 dans styles.xml et de l’utiliser partout en utilisant "@style/themName" pour que le précédent soit le même. 

Android:theme="@style/AppTheme"

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

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

Astuces: 

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

    <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
      }
    }
    
10
msoliman

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

Mais il y avait une autre chose qui a résolu le problème. J'ai spécifié le thème pour l'application à être @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 contient <item name="Android:windowActionBar">true</item>, peut être utilisé.

10
ntoskrnl

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

8
Pratap Singh

aller au fichier AndroidManifest.xml et remplacer

Android: theme = "@ style/AppTheme"

by 

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

7
NEERAJ GUPTA

Utilisez getSupportActionBar () au lieu de getActionBar ()

5
sonal balekai

Dans mon cas, j'avais dans mon code cela 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);
}

Ensuite, 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.

4
Simon

J'ai eu le même problème. Il a résolu en changeant 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">
3
jafarmlp

Une chose que je voulais ajouter depuis que je viens de rencontrer ceci, si vous essayez d’obtenir getActionBar () sur une activité ayant un parent, elle renverra la valeur null. J'essaie de refactoriser le code dans lequel mon activité est contenue dans un ActivityGroup, et il m'a fallu quelques bonnes minutes pour me rendre "oh duh" après avoir examiné la source de la création d'un ActionBar en source.

2
C Nick

Je le résout par ces changements:

  1. changement dans le minifest Android:theme="@Android:style/Theme.Holo.Light" >
  2. ajouter à la classe extends ActionBarActivity
  3. ajouter une importation à la classe import Android.support.v7.app.ActionBarActivity
1

Dans mon cas, je devais simplement étendre AppCompatActivity au lieu de Activity

    supportActionBar?.setDisplayHomeAsUpEnabled(true)

Exemple d'activité complète:

importer Android.os.Bundle importer 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
0
DaddyMoe

Cela peut aussi aider certaines personnes.

Dans mon cas, c'était parce que je n'avais pas défini de contexte dans le fichier 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
ElaGorilaki

Essayez d'étendre votre classe d'activité à 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 que de l'activité.

0
Alyoshak

Pour ajouter aux autres réponses:

Assurez-vous que vous appelez setActionBar() ou setSupportActionBar() dans votre méthode onCreate() avant d'appeler le getActionBar():

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

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

Je sais que je suis en retard à la fête (et que je viens d’être sur Android) sur cette question, mais j’ai trouvé les informations ici très utiles et j’ai pensé ajouter les résultats de mes propres efforts pour faire fonctionner ActionBar comme je le souhaitais 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:backgroundDimEnabled et Android:windowNoTitle. Le widget a bien fonctionné jusqu'à ce que je veuille ajouter un bouton appelé fragment d'une pagette avec plusieurs pages de fragments de liste et utilisé le ActionBar. L'activité du pager se bloquerait avec une exception de pointeur nul. Je l'ai réduit à la barre d'action étant nulle. Suite aux découvertes d'anciennes personnes ayant contribué à ce fil, j'ai supprimé mon thème du fichier manifeste et l'ActionBar fonctionnait bien, mais maintenant ma fenêtre flottait plus longtemps (elle était en plein écran) et elle contenait un titre de page que je ne voulais pas.

Des recherches ultérieures m'ont conduit au Guide de formation sur l'API Styles et thèmes 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 désirée.

0
DocM

Il suffit de vérifier l’implémentation du code source en cliquant sur:

    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 du problème car je voyais que requestWindowFeature (Window.FEATURE_ACTION_BAR) échouait. le code est open source utilisez-le !!

0
Ankish Jain