wake-up-neo.com

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

Über xml kann ich meiner Aktion im ActionBar Untermenüpunkte hinzufügen.

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>

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 Zeichen wird nicht angezeigt), der richtigen Schaltfläche, nicht der Schaltfläche "Neues Formular":

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>

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üelemente über Java Code anstelle von XML, ohne mit einem PopupMenu ( http://developer.Android.com/guide/topics/ui/menus.html#PopupMen )?

Update (Lösung):

Mein letztes Code-Snippet, mit dem ich das Untermenü dynamisch ausgefüllt habe, lautete die 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;
}
62
Mathias Conradt

Ja da ist.

Die Methode addSubMenu gibt ein Objekt SubMenu zurück. Ein SubMenu ist auch ein Menu , sodass Sie add aufrufen können, um dem Untermenü statt dem übergeordneten Menü Elemente hinzuzufügen. Der obige Code erstellt zwei verschiedene Untermenüs für Formular 1 und Formular 2 anstatt zwei Elemente in einem einzelnen Untermenü für 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);
35
adamp

Das Hinzufügen eines ActionProviders ist möglicherweise einfacher. Sie können versuchen, wie erklärt hier

2
Filippo Mazza

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