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.
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.)
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>
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);
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.
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);
}
}
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"
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. 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!
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>
<?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é.
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" />
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>