web-dev-qa-db-fra.com

Comment afficher les icônes dans le menu de débordement d'ActionBar?

Je veux afficher l'icône en plus du titre de l'élément de menu dans le menu déroulant de débordement.

Est-ce possible?

23
Alexey Zakharov

mettez votre menu avec la propriété Android:showAsAction="always" et dans le fichier xml du menu, ajoutez des sous-menus sous votre menu comme celui-ci

<item
        Android:id="@+id/mainMenu"
        Android:icon="@drawable/launcher"
        Android:showAsAction="always">
        <menu>

            <item
                Android:id="@+id/menu_logout"
                Android:icon="@drawable/log_out"
                Android:title="logout"/>
        </menu>
    </item>

cela montrera les icônes dans les menus

33
androido

Vous avez peut-être le même problème que moi. Donc pour moi, la solution était facile si vous utilisez AppCompat, n'utilisez pas cette propriété:

Android:showAsAction="always"

utilisez-le plutôt comme ceci:

<?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/option"
        Android:title="@string/option"
        Android:icon="@drawable/option"
        app:showAsAction="always">
    </item>
</menu> 

Il y a une différence dans l'aditional xmlns: app et showAsAction est la propriété de app.

J'espère que cela aide quelqu'un.

4
HugoMasterPL

Il existe en fait un moyen facile de le faire, car ce que vous voyez est en fait un TextView, vous définissez donc une étendue, par exemple:

final MenuItem menuItem=...
final ImageSpan imageSpan=new ImageSpan(this,R.drawable.ic_stat_app_icon);
final CharSequence title=" "+menuItem.getTitle();
final SpannableString spannableString=new SpannableString(title);
spannableString.setSpan(imageSpan,0,1,0);
menuItem.setTitle(spannableString);

Cela mettra une icône au début de l'élément de menu, juste avant son texte d'origine.

4
android developer

Je déteste les réponses comme ça, mais je ne suis pas assez bon pour donner une meilleure réponse.

L'icône des éléments de débordement pour le menu est la ligne de sous-menu "subMenu2Item.setIcon (R.drawable.ic_launcher);" remplacez simplement ic_launcher par votre fichier d'icônes (dans le répertoire res drawable de votre programme). J'espère que vous entendez utiliser ActionBarSherlock.

La ligne subMenu1Item.setIcon (R.drawable.ic_launcher); est pour l'icône ActionBar pour le bouton Menu en haut.

en réponse à "Ce n'est pas possible par conception"

Un grand merci à Google pour avoir tenté de conquérir le monde et de nous laisser rouler sur ses queues, MAIS ... Google est trop incohérent pour être grincheux sur les incohérences. Ce serait bien si Google pouvait faire un exemple pour CHAQUE "ensemble" d'API qu'ils proposent. Il y a des références API au code, mais aucun exemple sur la façon de les assembler. Un exemple complet qui peut être exécuté comme APK est tout ce que je veux. Je peux le tromper à partir de là. S'ils peuvent prendre le temps d'écrire l'APK, combien serait-il plus difficile de coder un petit exemple sur un modèle standard? Pour 30% de tout ce n'est pas beaucoup demander. J'ai eu ce même argument avec Microsoft à l'époque et cela ne s'est pas produit non plus. Et ainsi et ainsi vous obtenez stackoverflow. :) C'est dommage qu'il faut un gars (rock sur Jake Wharton) travaillant seul pour faire un meilleur travail avec une barre d'action rétrocompatible que Google peut proposer son ridicule truc Action Bar Patch.

@Override
public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) {

    SubMenu subMenu1 = menu.addSubMenu("Action Item");
    subMenu1.add("Help");
    subMenu1.add("About");

    MenuItem subMenu1Item = subMenu1.getItem();
    subMenu1Item.setIcon(R.drawable.ic_launcher);
    subMenu1Item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT);

    SubMenu subMenu2 = menu.addSubMenu("All Options");
    subMenu2.add("Help");
    subMenu2.add("About");

    MenuItem subMenu2Item = subMenu2.getItem();
    subMenu2Item.setIcon(R.drawable.ic_launcher);

    return super.onCreateOptionsMenu(menu);
}
2
tester
@Override
public boolean onMenuOpened(int featureId, Menu menu)
{
    if(featureId == Window.FEATURE_ACTION_BAR && menu != null){
        if(menu.getClass().getSimpleName().equals("MenuBuilder")){
            try{
                Method m = menu.getClass().getDeclaredMethod(
                    "setOptionalIconsVisible", Boolean.TYPE);
                m.setAccessible(true);
                m.invoke(menu, true);
            }
            catch(NoSuchMethodException e){
                Log.e(TAG, "onMenuOpened", e);
            }
            catch(Exception e){
                throw new RuntimeException(e);
            }
        }
    }
    return super.onMenuOpened(featureId, menu);
}

Référence: Comment afficher les icônes dans le menu Overflow dans ActionBar

2
Abhinav

Ce n'est pas possible par conception (au moins dans HC - et je développe sur API 16 et je n'ai aucune icône non plus). Google ne veut pas que nous le fassions.

Pour un peu de discussion sur le sujet, voir la réponse connexe ici:

Comme l'un des commentaires le suggère, si vous avez besoin des icônes, envisagez d'utiliser un menu déroulant plutôt que le menu de débordement.

1