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

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

Indépendamment de ce qui est spécifié dans showAsAction pour un élément de menu, il 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>

Est-ce un bug de la nouvelle bibliothèque de support v7, ou juste quelque chose de mal avec le code? J'ai été en utilisant le code similaire avec ActionBarSherlock plusieurs fois avant.

113
demandé sur Nikola Despotoski 2013-07-29 03:24:12

12 réponses

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 tout espace de noms que votre cœur désire partout.

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 versions aussi bas 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 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 de n'importe quel nom et n'est accessible que dans la portée du fichier dans lequel vous le déclarez.)

308
répondu Nikola Despotoski 2014-03-16 04:17:38

Compris moi-même. Avec la bibliothèque de support V7, showAsAction devrait passer sous un espace de noms personnalisé comme ceci:

<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
répondu Mcingwe 2013-07-28 23:43:14

Assurez-vous également que vous utilisez inflater correct dans ActionBarActivity.méthode 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);
27
répondu petrnohejl 2013-11-21 11:27:02

Pour Fragments

Les Menus avec un espace de noms personnaliséprévenir showAsAction de montrer.

L'utilisation du préfixe "android:" pour showAsAction fonctionnera, même si Android Studio vous remarquera que devrait utiliser un espace de nom 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>

Ceci utilise Android SDK 22 et supporte les fragments v4, au cas où cela ferait une différence.

22
répondu Baker 2015-10-30 11:34:21

A eu le MÊME PROBLÈME, MAIS sur Android 5. J'ai 3 éléments mais OS 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);
    }
}
15
répondu Lukas 2015-12-18 16:14:00

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

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

Après ce remplacement, vous pouvez écrire android: showAsAction= "toujours"

6
répondu Anton Kizema 2015-04-24 10:36:13

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

J'avais

<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'était que ça ne marchait pas. Je ne sais pas comment j'ai réussi à oublier la partie /apk du chemin, mais c'est arrivé. Pas de message d'erreur, juste un bug insaisissable à traquer.
5
répondu BeccaP 2013-10-28 19:20:10

Ce n'est peut-être pas votre cas mais j'utilisais

new MenuInflater(this).inflate(R.menu.my_menu, menu);

Le changer en

getMenuInflater().inflate(R.menu.my_menu, menu);

Correction du problème!

3
répondu Bakhshi 2017-06-16 06:23:51

Avait le même problème.

J'avais

<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item 
    android:id="@+id/searchRunner"
    android:icon="@drawable/ic_home_black"
    android:title="Search"
    android="ifRoom"/></menu>

Au Lieu de

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item 
    android:id="@+id/item1"
    android:title="Options"/>
<item 
    android:id="@+id/searchRunner"
    android:icon="@drawable/ic_home_black"
    android:title="Search"
    app:showAsAction="ifRoom"/></menu>
0
répondu Yohan Dahmani 2016-07-05 13:51:02
<?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 fonctionne pas, avec supportLibraryVersion = '25.1.0' compileSdkVersion = 25

Voir "avertissement"

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

Lorsque vous utilisez la bibliothèque appcompat, les ressources de menu doivent faire référence à showAsAction dans l'espace de noms app: , pas l'espace de noms android:.

De même, lorsque vous n'utilisez pas la bibliothèque appcompat, vous devriez être en utilisant la Android: attribut showAsAction.

Je pense que l'avertissement peut être ignoré.

0
répondu Bill 2017-04-07 08:02:35

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
répondu Amirouche Zeggagh 2017-09-17 10:17:26

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
répondu Paweł 2018-07-11 09:48:43