showAsAction = “ifRoom” n’affiche pas l’élément même s’il y a beaucoup de place

J’essaie de faire fonctionner correctement l’ActionBar sur mon application (et j’utilise ActionBarSherlock pour obtenir une interface utilisateur unifiée entre Android 2.x et 4.x).

Je me sens comme android:showAsAction="ifRoom" est juste un gros mensonge. Chaque fois que je définis une action sur ifRoom elle apparaît TOUJOURS dans le menu de débordement même s’il y a beaucoup de place. Voici deux captures d’écran du même émulateur. La première affiche ActionBar avec toutes les options définies sur always et la seconde affiche ActionBar avec les deux dernières options définies sur ifRoom . Comme vous pouvez le voir, il y avait BEAUCOUP de place quand ils ont tous été affiché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?

entrer la description de l'image ici

entrer la description de l'image ici

Voici mon menu.xml:

          

J’espère que je ne suis pas trop tard pour venir à la fête.

Ce n’est vraiment pas un gros mensonge mais un petit oubli.

L’atsortingbut showAsAction doit être défini à l’aide d’un espace de nom différent "http://schemas.android.com/apk/res-auto"

Vous devez donc définir un espace de noms dans votre balise de menu supérieure, comme suit xmlns:app="http://schemas.android.com/apk/res-auto"

puis utilisez-le pour définir votre atsortingbut showAsAction comme si app:showAsAction="ifRoom"

Cela devrait le réparer

C’est parce qu’il y a un nombre maximum spécifié d’éléments qui devraient aller à la barre d’action et il semble être 4. Bien sûr, vous pouvez les forcer à apparaître en définissant showAsAction: always mais en ce qui concerne les guides API Google:

Si vous pensez que plus de quatre éléments de votre menu peuvent être justifiés en tant qu’objects d’action, vous devez alors considérer leur niveau d’importance relative et essayer de ne pas définir plus de quatre éléments d’action (en utilisant la valeur “ifRoom” pour autoriser le système à en remettre dans le menu de débordement 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 un long stream d’éléments qui encombrent l’interface utilisateur et apparaissent comme une barre d’outils sur le bureau. Veillez donc à limiter le nombre d’éléments d’action.

En outre, les actions suivantes ne doivent jamais apparaître en tant qu’éléments d’action: parameters, aide, commentaires ou similaire. Toujours les conserver dans le menu de débordement.

Pour compléter la réponse de Michal Z .: Le modèle de page Android Pattern Patterns-> Actionbar dit 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:

  • Les boutons d’action dans la barre d’action principale peuvent ne pas occuper plus de 50% de la largeur de la barre .
  • Les boutons d’action sur les barres d’action inférieures peuvent utiliser toute la largeur.
  • La largeur de l’écran en pixels indépendants de la densité (dp) détermine le nombre d’éléments qui rentreront dans la barre d’action principale:
    • plus petit que 360 ​​dp = 2 icons
    • 360-499 dp = 3 icons
    • 500-599 dp = 4 icons
    • 600 dp et plus = 5 icons

utiliser app:showAsAction="always" au lieu d’ android:showAsAction="always"

Utilisation

  

Utilisez ce code ci-dessous, il fonctionnera toujours

    

ActivityBar s’efforce de ne pas dépasser certains éléments visibles. Et cette limite est inférieure à celle que ActivityBar peut contenir. La limite est définie dans la classe android.support.v7.view.ActionBarPolicy :

 `/** * 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; } }` 

`/** * 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 voir, la limite est comprise entre 2 et 5 et dépend de la largeur de l’écran.

Je n’ai pas pu trouver un moyen de changer ce comportement. Donc, si vous souhaitez dépasser la limite, vous devez utiliser showAsAction = “always” ou créer votre propre vue pour ActionBar .