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.
Peut utiliser getSupportActionBar()
au lieu de la méthode getActionBar()
.
import Android.support.v7.app.ActionBarActivity;
public class MainActivity extends ActionBarActivity {
getSupportActionBar()
au lieu de getActionBar()
import Android.support.v7.app.ActionBarActivity;
Je recommande d'utiliser:
import Android.support.v7.app.AppCompatActivity
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 ().
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" />
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();
Si vous utilisez Android.support.v4.app.FragmentActivity
public class HomeActivity étend FragmentActivity {
alors vous devriez utiliser Android.app.ActionBar
ActionBar ab = getActionBar();
Si vous utilisez Android.support.v7.app.ActionBarActivity
classe publique HomeActivity étend ActionBarActivity {
vous devriez utiliser Android.support.v7.app.ActionBar
ActionBar ab = getSupportActionBar();
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" >
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.
import Android.support.v7.app.AppCompatActivity;
puis
extends AppCompatActivity
puis utiliser
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
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:
"@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
}
}
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é.
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.
aller au fichier AndroidManifest.xml et remplacer
Android: theme = "@ style/AppTheme"
by
Android: theme = "@ Android: style/Theme.Holo.Light.DarkActionBar"
Utilisez getSupportActionBar () au lieu de getActionBar ()
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.
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">
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.
Je le résout par ces changements:
Android:theme="@Android:style/Theme.Holo.Light" >
extends ActionBarActivity
import Android.support.v7.app.ActionBarActivity
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
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">
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é.
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);
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.
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 !!