studio menus ejemplos desplegable contextual context bar android menu menuitem submenu

menus - popup menu android



Android agrega un submenú a un elemento de menú, ¿dónde está addSubMenu()? (8)

Quiero agregar un submenú dentro de mi menú de opciones a un elemento de menú, programáticamente según mis parámetros. He comprobado "MenuItem" en Android sdk y no hay ningún método addSubMenu (), aunque puedes encontrar "hasSubMenu ()" y "getSubMenu".

Estaba pensando en hacer esto en 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!!!??? ....

¿Cómo creo un submenú dentro de un menú en código?


A veces la rareza de Android es realmente asombrosa (y divertida ...). Lo resolví de esta manera:

a) Defina en XML un marcador de posición de submenú como este:

<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) Obtenga el elemento del submenú en OnCreateOptionsMenu, elimínelo y agregue los elementos de mi submenú, como este:

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


Aquí hay una respuesta completa que se basa en la idea de usar un marcador de posición, pero utiliza principalmente xml para agregar el submenú.

Si tiene un menú como el llamado 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>

Cree otro menú sub_menu.xml que se usará en 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>

En su 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()); }

Esta solución es agradable ya que el inflador maneja la mayor parte del trabajo.


Deberías considerar usar un ActionProvider en su lugar.

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


La mejor manera de hacerlo es en su archivo de menú xml. Puede hacer esto creando un nuevo objeto de menu dentro de un item :

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


Para proporcionar un ejemplo completo de la respuesta de Phil, aquí está mi XML completo y funcional para un menú con dos opciones, cada una de las cuales es un menú con tres opciones. Tengo la intención de agregar un tercer menú al nivel superior ...

<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>


Sé que esta es una vieja pregunta, pero acabo de encontrarme con este problema. La forma más directa de hacer esto, parece ser simplemente especificar el elemento en sí como un submenú, luego agregarlo a este elemento. P.ej:

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)); : :


Simplemente crearía el submenú en el archivo xml, y en tiempo de ejecución obtendré el submenú del objeto de menú (usando el método findItem (id)) y usaré submenu.setVisible (booleano) para agregarlo / eliminarlo en el tiempo de ejecución.


<?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>