Android добавляет подменю в menuItem, где есть 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!!!???
....
Как создать подменю внутри элемента menu в коде?
Ответы
Ответ 1
Иногда 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;
}
}
Ответ 2
Я знаю, что это старый вопрос, но я сам столкнулся с этой проблемой.
Самый простой способ сделать это, похоже, просто указать элемент как подменю, а затем добавить к этому элементу.
Например:.
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));
:
:
Ответ 3
Вот полный ответ, который основывается на идее использования заполнителя, но использует в основном 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>
Создайте еще одно меню sub_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());
}
Это решение хорошо, поскольку надуватель обрабатывает большую часть работы.
Ответ 4
Лучший способ сделать это - в вашем файле меню xml. Вы можете сделать это, создав новый menu
объект внутри item
:
<menu>
<item>
...
<menu>
...
</menu>
...
</item>
</menu>
Ответ 5
Чтобы предоставить исчерпывающий пример ответа Фила, вот мой полный, рабочий 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>
Ответ 6
Вместо этого вы должны использовать 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();
}
}