android - 如何在代码中将子菜单项添加到 ActionBar 操作?

标签 android android-3.0-honeycomb menuitem android-actionbar

通过 xml,我可以在 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>

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

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 代码:

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

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

更新(解决方案):

我最终得到的代码 fragment 是动态填充子菜单,遵循 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;
}

最佳答案

是的,有。

addSubMenu 方法返回 SubMenu目的。 SubMenu 也是 Menu ,因此您可以在其上调用 add 以将项目添加到子菜单而不是父菜单。您上面的代码是为 Form 1 和 Form 2 创建两个不同的子菜单,而不是在一个 New Form 子菜单中创建两个项目。

例子:

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

关于android - 如何在代码中将子菜单项添加到 ActionBar 操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9344160/

相关文章:

android - 向 ActionBar 下拉微调器添加样式使其不再是下拉列表

delphi - 如何添加在 OSX 上按预期工作的菜单项分隔符?

wpf - 当我将模板应用于我的 MenuItem 时,单击它时不再显示下拉列表

android - 从 sdcard 将图像文件读入位图,为什么会出现 NullPointerException?

android studio 上的 java.lang.NoClassDefFoundError

android - 为 Nexus 7 flo 构建 AOSP,输入密码以解密存储

android - 用于编辑联系人的蜂窝同步适配器功能

android - 为 GridView 子级设置动画

android - 应用启动后如何去除AppBar阴影

c# - 将项目绑定(bind)到 MenuItem -> 使用命令