Android添加一个子菜单到menuItem,addSubMenu()在哪里?

我想在我的OptionsMenu中添加一个子菜单到一个menuItem,编程方式根据我的参数。 我已经检查了android sdk中的“MenuItem”,并且没有addSubMenu()方法,虽然你可以find“hasSubMenu()”和“getSubMenu”。

想在onCreateOptionsMenu做到这一点:

public boolean onCreateOptionsMenu(Menu menu) { MenuItem mi = menu.getItem(MYITEMID); // << this is defined in my XML optionsMenu SubMenu subm = mi.addSubMenu(0,1,0,"Map 1"); // no addSubMenu() method!!!??? .... 

如何在代码中的菜单项中创build一个子菜单?

有时Android的怪异真的很神奇(而且很有趣)。 我这样解决了它:

a)在XML中定义一个子菜单占位符,如下所示:

 <item android:visible="true" android:id="@+id/m_area" android:titleCondensed="Areas" android:title="Areas" android:icon="@drawable/restaur" android:enabled="true"> <menu> <item android:id="@+id/item1" android:title="Placeholder"></item> </menu> </item> 

b)获取OnCreateOptionsMenu中的子菜单项,清除它并添加我的子菜单项,如下所示:

  public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.mapoptions, menu); int idx=0; subm = menu.getItem(MYITEM_INDEX).getSubMenu(); // get my MenuItem with placeholder submenu subm.clear(); // delete place holder while(true) { anarea = m_areas.GetArea(idx); // get a new area, return null if no more areas if(anarea == null) break; subm.add(0, SUBAREASID+idx, idx, anarea.GetName()); // id is idx+ my constant ++idx; } } 

我知道这是一个古老的问题,但我自己却遇到了这个问题。 这样做的最直接的方法似乎是将项目本身指定为子菜单,然后添加到该项目。 例如:

 menu.add(groupId, MENU_VIEW, Menu.NONE, getText(R.string.menu_view)); menu.add(groupId, MENU_EDIT, Menu.NONE, getText(R.string.menu_edit)); SubMenu sub=menu.addSubMenu(groupId, MENU_SORT, Menu.NONE, getText(R.string.menu_sort)); sub.add(groupId, MENU_SORT_BY_NAME, Menu.NONE, getText(R.string.menu_sort_by_name)); sub.add(groupId, MENU_SORT_BY_ADDRESS, Menu.NONE, getText(R.string.menu_sort_by_address)); : : 

这是一个完整的答案,它build立在使用占位符的想法上,但主要使用xml来添加子菜单。

如果你有一个像main_menu.xml这样的菜单:

 <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:title="My Menu" android:id="@+id/my_menu_item"> <!-- A empty SubMenu --> <menu></menu> </item> </menu> 

创build将在my_menu_item中使用的另一个菜单sub_menu.xml:

 <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:title="SubMenu One" android:id="@+id/submenu_one" /> <item android:title="SubMenu Two" android:id="@+id/submenu_two" /> <item android:title="SubMenu Three" android:id="@+id/submenu_three" /> </menu> 

在你的onCreateOptionsMenu:

 public boolean onCreateOptionsMenu(Menu menu) { // Inflate your main_menu into the menu getMenuInflater().inflate(R.menu.main_menu, menu); // Find the menuItem to add your SubMenu MenuItem myMenuItem = menu.findItem(R.id.my_menu_item); // Inflating the sub_menu menu this way, will add its menu items // to the empty SubMenu you created in the xml getMenuInflater().inflate(R.menu.sub_menu, myMenuItem.getSubMenu()); } 

这个解决scheme很好,因为充气器可以处理大部分的工作。

最好的方法是在你的xml菜单文件中。 你可以通过在一个item创build一个新的menu对象来完成这个任务:

 <menu> <item> ... <menu> ... </menu> ... </item> </menu> 

为了提供一个Phil的答案的全面例子,这里是我的完整的,有效的XML的菜单有两个select,每个菜单有三个select。 我打算在顶层添加第三个菜单…

 <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:HTMLCode="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/Examine" android:title="@string/Examine" HTMLCode:showAsAction="always"> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:HTMLCode="http://schemas.android.com/apk/res-auto" > <item android:id="@+id/load" android:title="@string/load" HTMLCode:showAsAction="ifRoom|withText" /> <item android:id="@+id/findfirst" android:title="@string/findfirst" HTMLCode:showAsAction="ifRoom|withText" /> <item android:id="@+id/findnext" android:title="@string/FindNext" HTMLCode:showAsAction="ifRoom|withText" /> </menu> </item> <item android:id="@+id/Redirect" android:title="@string/Redirect" HTMLCode:showAsAction="ifRoom|withText"> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:HTMLCode="http://schemas.android.com/apk/res-auto" > <item android:id="@+id/getRedirect" android:title="@string/getRedirect" HTMLCode:showAsAction="ifRoom|withText" /> <item android:id="@+id/toggleRedirect" android:title="@string/toggleRedirect" HTMLCode:showAsAction="ifRoom|withText" /> <item android:id="@+id/copyRedirect" android:title="@string/copyRedirect" HTMLCode:showAsAction="ifRoom|withText" /> </menu> </item> </menu> 

你应该考虑使用一个ActionProvider。

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