62 votes

Comment ajouter des éléments de sous-menu à l'action ActionBar en code ?

Via xml, je peux ajouter des éléments de sous-menu à mon action dans la section ActionBar .

enter image description here

main_menu.xml :

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/menu_new_form"
          android:icon="@drawable/ic_new_form"
          android:title="@string/menu_new_form"
          android:showAsAction="ifRoom|withText">
        <menu>
            <item android:id="@+id/form1"
                  android:icon="@drawable/attachment"
                  android:title="Form 1"
                  android:onClick="onSort" />
            <item android:id="@+id/form2"
                  android:icon="@drawable/attachment"
                  android:title="Form 2"
                  android:onClick="onSort" />
        </menu>
    </item>
</menu>

Mais comment puis-je ajouter ces sous-éléments via le code Java ? ? Cela ne fonctionne pas comme ci-dessous, les sous-éléments sont ajoutés à la mauvaise action (et aussi le dessinable n'est pas montré), le bouton tout à droite, pas mon bouton 'New Form' :

enter image description here

main_menu.xml :

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/menu_new_form"
          android:icon="@drawable/ic_new_form"
          android:title="@string/menu_new_form"
          android:showAsAction="ifRoom|withText">
    </item>
</menu>

Code Java :

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main_menu, menu);

    Log.d("MainMenu", ",menu title0: " + menu.getItem(0).getTitle()); 
    // returns "New Form"

    menu.addSubMenu(0, Menu.NONE, 1, "Form 1").setIcon(R.drawable.attachment);
    menu.addSubMenu(0, Menu.NONE, 2, "Form 2").setIcon(R.drawable.attachment);
    return true;
}

Existe-t-il un moyen d'y parvenir, en ajoutant des éléments de sous-menu via le code Java au lieu du XML ? sans en utilisant un PopupMenu ( http://developer.Android.com/guide/topics/ui/menus.html#PopupMenu ) ?

Mise à jour (solution) :

Le code que j'ai fini par utiliser pour remplir le sous-menu de façon dynamique, suite à la réponse d'adamp :

// menu options
private static final int MENU_PREFERENCES = Menu.FIRST;
private static final int MENU_LOGOUT = 2;

@Override
public boolean onCreateOptionsMenu(final Menu menu) {
    super.onCreateOptionsMenu(menu);

    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main_menu, menu);
    menu.add(0, MENU_PREFERENCES, 0, getString(R.string.general_preferences)).setIcon(
            android.R.drawable.ic_menu_preferences);

    // load all available form templates
    Cursor c = managedQuery(FormsProviderAPI.FormsColumns.CONTENT_URI, null, null, null, null);
    try {
        int ixDisplayName = c.getColumnIndex(FormsProviderAPI.FormsColumns.DISPLAY_NAME);
        int ixId = c.getColumnIndex(FormsProviderAPI.FormsColumns._ID);
        int cnt = 0;
        while (c.moveToNext()) {
            cnt++;
            Log.d("ID: ", "ID: "+ c.getInt(ixId));  // misusing the group id for the form id
            menu.getItem(1).getSubMenu().addSubMenu(c.getInt(ixId), Menu.NONE, cnt, c.getString(ixDisplayName)).setIcon(R.drawable.attachment_dark);
        }
    } catch (Exception e) {
        Log.e(TAG, "Error init form templates list.", e);
    }

    return true;
}

1 votes

J'utilise ce code pour mon application @Override public boolean onCreateOptionsMenu(menu menu) { // TODO stub de méthode auto-généré super.onCreateOptionsMenu(menu) ; MenuInflater inflater = getMenuInflater() ; inflater.inflate(R. menu.poi_menu, menu) ; for (int i = 0 ; i < name.length ; i++) { menu.getItem(0).getSubMenu() .add(0, Menu.NONE, i, name[i] + " (" + type[i] + ")") .setIcon(R.drawable.zoomin) ; } return true ; } mais l'icône n'apparaît toujours pas...

36voto

adamp Points 19097

Si, il y en a un.

El addSubMenu renvoie un SubMenu objet. A SubMenu est également un Menu Vous pouvez donc appeler add sur celui-ci pour ajouter des éléments au sous-menu plutôt qu'au menu parent. Votre code ci-dessus crée deux sous-menus différents pour le formulaire 1 et le formulaire 2 plutôt que deux éléments dans un seul sous-menu Nouveau formulaire.

Ejemplo:

SubMenu submenu = menu.addSubMenu(0, Menu.NONE, 1, "New Form").setIcon(R.drawable.ic_new_form);
submenu.add("Form 1").setIcon(R.drawable.attachment);

0 votes

Merci, j'avais déjà compris hier et ça marche maintenant. Je pensais que je pouvais utiliser les GroupIds pour cela, je pensais que c'était leur but et qu'ils accrochaient l'élément dans la bonne hiérarchie. Merci encore.

0 votes

Les ID de groupe sont utilisés pour d'autres formes de regroupement logique. Par exemple, si des éléments de menu apparaissent dans la barre d'action sous le nom de "ifRoom", les éléments du même groupe déborderont ensemble - soit tous les éléments du groupe apparaîtront dans la barre, soit tous les éléments seront déplacés vers le menu de débordement. C'est utile pour les commandes connexes qui ne doivent pas être séparées dans la présentation.

1 votes

@MathiasLin Comment avez-vous résolu ce problème ? Parce que je suis confronté au même problème. Mais comme adamp l'a suggéré, il ajoute un sous-menu dans le menu principal (Nouveau formulaire dans le menu principal) et ensuite nous cliquons sur "Nouveau formulaire", il affiche l'élément "Formulaire 1", mais même si le dessinable n'apparaît pas. Pouvez-vous partager un code s'il vous plaît ?

2voto

Filippo Mazza Points 1029

L'ajout d'un ActionProvider est peut-être plus facile. Vous pouvez essayer comme expliqué ici

1voto

Sibelius Seraphini Points 1564

Vous devez envisager d'utiliser un ActionProvider

exemple : https://gist.github.com/sibelius/7ca0b757492ff6740dec

Menu avec élément de fournisseur d'action

<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">

    <item android:id="@+id/action_companies"
        android:icon="@drawable/ic_list"
        android:title="@string/action_companies"
        app:actionProviderClass="com.example.MyActionProvider"
        app:showAsAction="always"/>
</menu>

Code

public class MyActionProvider extends ActionProvider {

    private Context mContext;

    public MyActionProvider(Context context) {
        super(context);

        mContext = context;
    }

    @Override
    public View onCreateActionView() {
        //LayoutInflater layoutInflater = LayoutInflater.from(mContext);
        return null;
    }

    @Override
    public void onPrepareSubMenu(SubMenu subMenu) {
        super.onPrepareSubMenu(subMenu);

        subMenu.clear();

        subMenu.add("menu 1");
        subMenu.add("menu 2");
        subMenu.add("menu 3");
    }

    @Override
    public boolean hasSubMenu() {
        return true;
    }

    @Override
    public boolean onPerformDefaultAction() {
        return super.onPerformDefaultAction();
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X