Wie füge ich Untermenüpunkte zur ActionBar-Aktion im Code hinzu?

Lesezeit: 5 Minuten

Benutzer-Avatar
Matthias Conradt

Über xml kann ich Untermenüpunkte zu meiner Aktion in der hinzufügen ActionBar.

Geben Sie hier die Bildbeschreibung ein

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>

Aber wie kann ich diese Unterelemente über Java-Code hinzufügen? Es funktioniert nicht wie unten, die Unterelemente werden der falschen Aktion hinzugefügt (und auch das Drawable wird nicht angezeigt), die Schaltfläche ganz rechts, nicht meine Schaltfläche “Neues Formular”:

Geben Sie hier die Bildbeschreibung ein

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>

Java-Code:

@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;
}

Gibt es eine Möglichkeit, dies zu erreichen, indem Sie Untermenüpunkte über Java-Code anstelle von XML hinzufügen, ohne Verwendung einer PopupMenu (http://developer.android.com/guide/topics/ui/menus.html#PopupMenu)?

Update (Lösung):

Mein letztes Code-Snippet, mit dem ich das Untermenü dynamisch füllte, folgte der Antwort von 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;
}

  • Ich verwende diesen Code für meine Anwendung @Override public boolean onCreateOptionsMenu(Menu menu) { // TODO Automatisch generierter Methodenstub super.onCreateOptionsMenu(menu); MenuInflater Inflater = getMenuInflater(); inflater.inflate (R.menu.poi_menu, Menü); for (int i = 0; i < name.length; i++) { menu.getItem(0).getSubMenu() .add(0, Menu.NONE, i, name[i] + " (" + tippe[i] + ")") .setIcon(R.drawable.zoomin); } true zurückgeben; } aber das Symbol wird immer noch nicht angezeigt ...

    – Chirag Patel

    11. April 2012 um 7:07 Uhr

Ja da ist.

Das addSubMenu Methode gibt a zurück SubMenu Objekt. EIN SubMenu ist auch ein Menudamit Sie anrufen können add darauf, um Elemente zum Untermenü statt zum übergeordneten Menü hinzuzufügen. Ihr obiger Code erstellt zwei verschiedene Untermenüs für Formular 1 und Formular 2 und nicht zwei Elemente in einem einzigen Untermenü “Neues Formular”.

Beispiel:

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

  • Danke, ich hatte es gestern schon herausgefunden und funktioniert jetzt. Ich dachte, ich könnte die groupIds dafür verwenden, dachte, das wäre ihr Zweck und sie hängen das Element in die richtige Hierarchie. Danke noch einmal.

    – Mathias Conradt

    19. Februar 2012 um 4:39 Uhr

  • Die Gruppen-IDs werden für andere Formen der logischen Gruppierung verwendet. Wenn beispielsweise Menüelemente in der Aktionsleiste als “ifRoom” angezeigt werden, werden Elemente in derselben Gruppe zusammen überlaufen – entweder werden alle Elemente in der Gruppe in der Leiste angezeigt oder alle Elemente werden in das Überlaufmenü verschoben. Es ist nützlich für verwandte Befehle, die in der Präsentation nicht getrennt werden sollten.

    – dämpfen

    19. Februar 2012 um 20:10 Uhr

  • @MathiasLin Wie hast du dieses Problem gelöst? Denn ich stehe vor dem gleichen. Aber wie von Adamp vorgeschlagen, fügt es ein Untermenü im Hauptmenü hinzu (Neues Formular im Hauptmenü) und dann klicken wir auf “Neues Formular”, es zeigt das Element “Form 1”, obwohl Drawable nicht angezeigt wird. Kannst du bitte einen Code teilen?

    – Chirag Patel

    10. April 2012 um 9:02 Uhr

  • @chiragsaga Ich bin Adamps Hinweis gefolgt und es funktioniert gut für mich. Ich werde den Code in meiner ursprünglichen Frage aktualisieren/hinzufügen.

    – Mathias Conradt

    11. April 2012 um 3:10 Uhr

  • Und wenn jemand Elemente zu den Untermenüs hinzufügen möchte, die bereits aus dem XML bestehen, verwenden Sie menu.getItem(<index>).getSubMenu().add("menu item");

    – C–

    11. Dezember 2013 um 5:15 Uhr

Das Hinzufügen eines ActionProviders ist möglicherweise einfacher. Sie können es wie beschrieben versuchen hier

Benutzer-Avatar
Sibelius Serafini

Sie sollten in Betracht ziehen, einen ActionProvider zu verwenden

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

Menü mit Aktionsanbieterelement

<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();
    }
}

1203240cookie-checkWie füge ich Untermenüpunkte zur ActionBar-Aktion im Code hinzu?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy