J'essaie de faire fonctionner correctement la barre Action sur mon application (et j'utilise ActionBarSherlock pour obtenir une interface utilisateur unifiée entre Android 2.x et 4.x).
Je pense que Android:showAsAction="ifRoom"
est juste un gros mensonge. Chaque fois que je mets une action sur ifRoom
, elle apparaît TOUJOURS dans le menu de débordement, même s'il reste beaucoup d'espace. Voici deux captures d'écran du même émulateur. La première affiche la barre d'actions avec toutes les options définies sur always
et la seconde affiche la barre d'actions avec les deux dernières options définies sur ifRoom
. Comme vous pouvez le constater, il y avait beaucoup d'espace quand ils ont tous été montrés dans la capture d'écran always
, alors pourquoi ne sont-ils pas tous affichés dans la seconde parce qu'ils ont de la place?
Voici mon menu.xml:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android" >
<item
Android:id="@+id/add"
Android:icon="@drawable/ic_menu_btn_add"
Android:showAsAction="always"
Android:title="Add"/>
<item
Android:id="@+id/calculateNPV"
Android:icon="@drawable/menu_icon_npv"
Android:showAsAction="always"
Android:title="NPV"/>
<item
Android:id="@+id/calculateIRR"
Android:icon="@drawable/menu_icon_irr"
Android:showAsAction="always"
Android:title="IRR/YR"/>
<item
Android:id="@+id/send"
Android:icon="@Android:drawable/ic_menu_share"
Android:showAsAction="always"
Android:title="@string/share_pdf"/>
<item
Android:id="@+id/graph"
Android:icon="@drawable/ic_menu_gallery"
Android:showAsAction="ifRoom"
Android:title="@string/view_cashflow_diagram"/>
<item
Android:id="@+id/deleteReorder"
Android:icon="@drawable/ic_menu_clear_playlist"
Android:showAsAction="ifRoom"
Android:title="@string/delete_reorder_cashflows"/>
</menu>
J'espère que je ne suis pas trop en retard pour venir à la fête.
Ce n'est vraiment pas un gros mensonge, mais un petit oubli.
L'attribut showAsAction
doit être défini à l'aide d'un espace de nom différent "http://schemas.Android.com/apk/res-auto"
Vous devez donc, dans la balise du menu supérieur, définir un espace de nom comme suit xmlns:app="http://schemas.Android.com/apk/res-auto"
puis utilisez-le pour définir votre attribut showAsAction comme suit app:showAsAction="ifRoom"
Cela devrait résoudre le problème
C'est parce qu'il y a un nombre maximum spécifié d'éléments qui doivent aller à la barre d'action et il semble que ce soit 4. Bien sûr, vous pouvez les forcer à apparaître en définissant showAsAction: always
mais en ce qui concerne les guides de l'API Google:
Si vous pensez que plus de quatre éléments de votre menu peuvent être justifiés en tant que mesures à prendre, vous devez alors examiner attentivement leur parent niveau d'importance et essayez de ne pas définir plus de quatre points d'action (et utilisez la valeur "ifRoom" pour permettre au système de remettre du dans le menu de dépassement lorsque l'espace est limité sur des écrans plus petits) . Même si de l'espace est disponible sur un écran large, vous ne devez pas créer de fichier long flux d'éléments d'action qui encombrent l'interface utilisateur et apparaissent comme un barre d’outils du bureau, gardez donc le nombre d’actions minimum.
De plus, les actions suivantes ne doivent jamais apparaître en tant qu'action éléments: Paramètres, Aide, Commentaires, ou similaire. Toujours les garder dans le menu de débordement.
Pour compléter la réponse de Michal Z.:. La page Guide de conception Android Patterns-> Actionbar indique ce qui suit dans le chapitre "Boutons d'action":
http://developer.Android.com/design/patterns/actionbar.html
Combien d'actions vont tenir dans la barre d'action principale? La capacité de la barre d’action est contrôlée par les règles suivantes:
utilisez app:showAsAction="always"
au lieu de Android:showAsAction="always"
Utilisation
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android" xmlns:yourapp="http://schemas.Android.com/apk/res-auto" >
ActivityBar s'efforce de ne pas dépasser un certain nombre d'éléments visibles. Et cette limite est inférieure à ActivityBar peut contenir en effet. La limite est définie dans Android.support.v7.view.ActionBarPolicy class:
`/**
* Returns the maximum number of action buttons that should be permitted within an action
* bar/action mode. This will be used to determine how many showAsAction="ifRoom" items can fit.
* "always" items can override this.
*/
public int getMaxActionButtons() {
final Resources res = mContext.getResources();
final int widthDp = ConfigurationHelper.getScreenWidthDp(res);
final int heightDp = ConfigurationHelper.getScreenHeightDp(res);
final int smallest = ConfigurationHelper.getSmallestScreenWidthDp(res);
if (smallest > 600 || widthDp > 600 || (widthDp > 960 && heightDp > 720)
|| (widthDp > 720 && heightDp > 960)) {
// For values-w600dp, values-sw600dp and values-xlarge.
return 5;
} else if (widthDp >= 500 || (widthDp > 640 && heightDp > 480)
|| (widthDp > 480 && heightDp > 640)) {
// For values-w500dp and values-large.
return 4;
} else if (widthDp >= 360) {
// For values-w360dp.
return 3;
} else {
return 2;
}
}`
Comme vous pouvez le constater, la limite est comprise entre 2 et 5, et cela dépend de la largeur de l'écran.
Je n'ai pas été capable de trouver un moyen de changer ce comportement. Donc, si vous voulez dépasser la limite, vous devez utiliser showAsAction = "always" ou créer votre propre vue pour ActionBar .
Utilisez ce code ci-dessous il fonctionnera toujours
<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=".MainActivity">
<item
Android:id="@+id/menu_share"
Android:title="Share"
Android:orderInCategory="100"
app:showAsAction="ifRoom"
Android:actionProviderClass="Android.widget.ShareActionProvider"/>
</menu>