如何在代码中向ActionBar操作添加子菜单项?

Mat*_*adt 62 android menuitem android-3.0-honeycomb android-actionbar

通过xml我可以将子菜单项添加到我的动作中ActionBar.

在此输入图像描述

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>
Run Code Online (Sandbox Code Playgroud)

但是如何通过Java代码添加这些子项呢?它不起作用如下,子项被添加到错误的操作(并且还没有显示drawable),非常正确的按钮,而不是我的"新表单"按钮:

在此输入图像描述

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>
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

有没有办法实现这一点,通过Java代码而不是XML添加子菜单项,而不使用PopupMenu(http://developer.android.com/guide/topics/ui/menus.html#PopupMenu)?

更新(解决方案):

我最后的代码片段最后是在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;
}
Run Code Online (Sandbox Code Playgroud)

ada*_*amp 35

就在这里.

addSubMenu方法返回一个SubMenu对象.A SubMenu也是a Menu,因此您可以调用add它来将项目添加到子菜单而不是父菜单.上面的代码为表单1和表单2创建两个不同的子菜单,而不是在单个"新表单"子菜单中创建两个项目.

例:

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

  • 如果有人正在寻找将项目添加到XML中已存在的子菜单,请使用`menu.getItem(<index>).getSubMenu().add("menu item"); (4认同)