Android добавляет подменю в меню, где находится addSubMenu()?
Я хочу добавить подменю внутри моего OptionsMenu к меню, программно в соответствии с моими параметрами. Я проверил "MenuItem" в Android sdk и там нет метода addSubMenu ()!, хотя вы можете найти "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!!!???
....
Как создать подменю внутри меню в коде?
8 ответов:
Иногда странности Андроида действительно удивительны (и забавны..). Я решил ее следующим образом:
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)); : :
Вот полный ответ, который основан на идее использования заполнителя, но использует в основном 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>
Создайте еще один подменю меню.xml, который будет использоваться в my_menu_item:
<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()); }
Это решение хорошо, так как надуватель обрабатывает большую часть работы.
Лучший способ сделать это-в файле меню xml. Это можно сделать, создав новый объект
menu
внутри объектаitem
:<menu> <item> ... <menu> ... </menu> ... </item> </menu>
Чтобы дать исчерпывающий пример ответа Фила, вот мой полный рабочий XML для меню с двумя вариантами, каждый из которых является меню с тремя вариантами. Я намерен добавить третье меню на верхний уровень ...
<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(); } }
Я бы просто создал подменю в xml-файле, и во время выполнения получить подменю из объекта меню, (используя finditem(id) метод) и использовать подменю.setVisible (boolean), чтобы добавить/удалить его во время выполнения.
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/menu1" android:alphabeticShortcut="a" android:title="Menu No. 1" android:orderInCategory="1" /> <item android:id="@+id/menu2" android:alphabeticShortcut="b" android:title="Menu No. 2" android:orderInCategory="2"> <menu > <group android:id="@+id/group2" android:checkableBehavior="single"> <item android:id="@+id/submenu1" android:title="SubMenu No. 1" /> <item android:id="@+id/submenu2" android:title="SubMenu No. 2" /> </group> </menu> </item>