web-dev-qa-db-fra.com

Élément de menu Android 4.3 showAsAction = "toujours" ignoré

J'utilise la nouvelle bibliothèque v7 appcompat disponible à partir d'Android 4.3 (API niveau 18).

Indépendamment de ce qui est spécifié dans showAsAction pour un élément de menu, celui-ci n'est pas affiché - il crée toujours l'icône de menu de débordement et place même un seul élément de menu sous le menu.

Essayer d'ajouter un menu à une activité comme celle-ci:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_sizes, menu);
    return true;
}

Et voici mon menu xml:

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:id="@+id/menu_add_size"
        Android:title="@string/menu_add_item"
        Android:orderInCategory="10"
        Android:showAsAction="always"
        Android:icon="@Android:drawable/ic_menu_add" />
</menu>

S'agit-il d'un bogue de la nouvelle bibliothèque de support technique v7 ou simplement d'un problème avec le code? J'utilisais le code similaire avec ActionBarSherlock plusieurs fois auparavant.

113
Mcingwe

Il vous manque probablement l'espace de noms requis:

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
      xmlns:[yourapp]="http://schemas.Android.com/apk/res-auto">
    <item Android:id="@+id/menu_add_size"
        Android:title="@string/menu_add_item"
        Android:orderInCategory="10"
        [yourapp]:showAsAction="always"
        Android:icon="@Android:drawable/ic_menu_add" />
</menu>

Remplacez [yourapp] par le nom de votre application ou par tout espace de nom souhaité par votre cœur.

Autres choses à vérifier:

  • Voir si votre classe d'activité s'étend ActionBarActivity

Vérifiez si le problème persiste.


Documentation de référence Android: Ajout de boutons d'action . Voici le texte pertinent:

Si votre application utilise la bibliothèque de support pour des raisons de compatibilité sur des versions aussi basses que Android 2.1, l'attribut showAsAction n'est pas disponible à partir de l'espace de noms Android:. Au lieu de cela, cet attribut est fourni par la bibliothèque de support technique et vous devez définir votre propre espace de noms XML et utiliser cet espace de noms comme préfixe d'attribut. (Un espace de noms XML personnalisé doit être basé sur le nom de votre application, mais il peut s'agir du nom de votre choix. Il est uniquement accessible dans la portée du fichier dans lequel vous le déclarez.) 

308
Nikola Despotoski

Je me suis compris. Avec la bibliothèque de support v7, showAsAction devrait se placer dans un espace de noms personnalisé comme celui-ci:

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
      xmlns:balloonberry="http://schemas.Android.com/apk/res-auto">
    <item Android:id="@+id/menu_add_size"
        Android:title="@string/menu_add_item"
        Android:orderInCategory="10"
        balloonberry:showAsAction="always"
        Android:icon="@Android:drawable/ic_menu_add" />
</menu>
52
Mcingwe

Assurez-vous également que vous utilisez le bon inflateur dans la méthode ActionBarActivity.onCreateOptionsMenu ().

Solution correcte:

MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate(R.menu.menu_example, menu);

Solution incorrecte:

MenuInflater menuInflater = new MenuInflater(this);
menuInflater.inflate(R.menu.menu_example, menu);
28
petrnohejl

Pour Fragments  

Les menus avec un espace de noms personnaliséempêcheront l'affichage deshowAsAction.

L'utilisation du préfixe "Android:" pour showAsAction fonctionnera, même si Android Studio remarquera que vous devez utiliser un espace de noms personnalisé.

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:id="@+id/action_add_checkin"
          Android:title="Add Checkin"
          Android:orderInCategory="10"
          Android:showAsAction="always"
        Android:icon="@Android:drawable/ic_menu_add"/>
</menu>

Cela utilise des fragments Android SDK 22 et Support v4, au cas où cela ferait une différence.

23
Baker

Vous avez le même problème, mais sur Android 5. J'ai 3 éléments mais le système d'exploitation a ignoré mon attribut "toujours" et n'a montré que 2 éléments. Voici ma solution:

  @Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    Log.d(TAG, "onCreateOptionsMenu()");
    inflater.inflate(R.menu.your_menu, menu);
    for (int j = 0; j < menu.size(); j++) {
        MenuItem item = menu.getItem(j);
        Log.d(TAG, "set flag for " + item.getTitle());
        item.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS);
    }
}
16
Lukas

Dans mon cas, j'ai dû supprimer de la compilation build.gradle de mon application 'com.Android.support:appcompat-v7:21.0.3'.

Avis : Mon sdk min = 14, et le projet créé par le studio Android inséré ma dépendance unnesessary.

Après cela, vous pouvez écrire Android: showAsAction = "toujours"

6
Anton Kizema

Assurez-vous également que vous avez le bon chemin pour l'espace-noms. Cela ne vous donnera pas un message d'erreur si c'est faux.

J'ai eu

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
      xmlns:myapp="http://schemas.Android.com/res-auto">

au lieu de

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
      xmlns:myapp="http://schemas.Android.com/apk/res-auto">

Tout ce que je savais, c'est que ça ne fonctionnait pas. Je ne sais pas comment j'ai réussi à oublier la partie/apk du chemin, mais c'est arrivé. Aucun message d'erreur, juste un bug insaisissable à traquer.

6
BeccaP

Le moyen le plus simple est Modifiez votre code en ajoutant 

xmlns:app="http://schemas.Android.com/apk/res-auto"

et changer ce code

Android:showAsAction="always"

à

app:showAsAction="always"

et enfin

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto">
    <item Android:id="@+id/menu_add_size"
        Android:title="@string/menu_add_item"
        Android:orderInCategory="10"
        app:showAsAction="always"
        Android:icon="@Android:drawable/ic_menu_add" />
</menu>
0
Abdulhakim Zeinu

Je l'ai résolu en remplaçant

Android:showAsAction="ifRoom"

avec 

app:showAsAction="ifRoom"

Cela ressemble à menuitme xml,

<item Android:id="@+id/action_refresh"
      Android:title="Refresh"
      Android:icon="@drawable/refresh2"
      app:showAsAction="ifRoom" />
0
Haris

Le moyen le plus simple est:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:myapp="http://schemas.Android.com/apk/res-auto">

    <item
        Android:id="@+id/history"
        Android:icon="@drawable/icons8_history_white_medium"
        Android:title="History"
        myapp:showAsAction="always" />
    <item
        Android:id="@+id/synchrnonize"
        Android:icon="@drawable/icons8_synchronize_white_medium"
        Android:title="Synchronize"
        myapp:showAsAction="always" />
</menu>
0
Paweł

ajoutez un espace de noms personnalisé comme celui-ci à showAsAction et à actionViewClass:

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto">
<item Android:id="@+id/search"
    Android:title="@string/search"
    Android:icon="@drawable/ic_search"
    app:showAsAction="collapseActionView|ifRoom"
    app:actionViewClass="Android.widget.SearchView" />

0
Amirouche Zeggagh
<?xml version="1.0" encoding="utf-8"?>
<menu
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    >
    <item
        Android:id="@id/back"
        Android:icon="@drawable/back"
        app:showAsAction="always"
        Android:title="@string/back"/>
    <item
        Android:id="@id/save"
        Android:icon="@drawable/le_top_btn_icon_add"
        app:showAsAction="ifRoom"
        Android:title="@string/save"/>
</menu>

ne travaille pas, avec supportLibraryVersion = '25 .1.0 ' compileSdkVersion = 25 

voir le "Warning" 

Devrait utiliser app: showAsAction avec la bibliothèque appcompat avec Xmlns: app = "http://schemas.Android.com/apk/res-auto" less ... (Ctrl + F1) 

Lorsque vous utilisez la bibliothèque appcompat, les ressources de menu doivent faire référence à showAsAction dans l’application: namespace, Et non à l’Android: namespace. 

De même, lorsque vous n'utilisez pas la bibliothèque appcompat, vous devez utiliser l'attribut Android: showAsAction.

Je pense que le warn peut être ignorer.

0
Bill