web-dev-qa-db-fra.com

showAsAction = "ifRoom" n'affiche pas l'élément même s'il y a suffisamment de place

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?

enter image description here

enter image description here

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>
43
Kenny Wyland

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

35
josagyemang

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.

12
Michał Z.

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:

  • Les boutons d'action de la barre d'action principale ne peuvent occuper plus de 50% de la largeur de la barre
  • Les boutons d'action situés en bas des barres d'action peuvent utiliser toute la largeur.
  • La largeur de l'écran, exprimée en pixels indépendants de la densité (dp), détermine le nombre d'éléments pouvant figurer dans la barre d'action principale:
    • plus petit que 360 ​​dp = 2 icônes
    • 360-499 dp = 3 icônes
    • 500-599 dp = 4 icônes
    • 600 dp et plus = 5 icônes
10
arne.jans

utilisez app:showAsAction="always" au lieu de Android:showAsAction="always"

4
Rahul_Pawar

Utilisation

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android" xmlns:yourapp="http://schemas.Android.com/apk/res-auto" >
2
Ravi Karki

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 .

0
ivan

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>
0
Creator