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