Android añadiendo un submenú a un menuItem, donde es addSubMenu ()?

Quiero agregar un submenú dentro de mi OptionsMenu a un menuItem, programatically según mis parámetros. He comprobado "MenuItem" en android sdk y no hay addSubMenu () método !, Aunque usted puede 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 puedo crear un submenú dentro de un menú en código?

A veces la rareza de Android es realmente increíble (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) Obtener el elemento del submenú en OnCreateOptionsMenu, borrarlo y agregar mis elementos de submenú, como esto:

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

Sé que esta es una vieja pregunta, pero me encontré con este problema yo mismo. La forma más sencilla de hacer esto, parece ser simplemente especificar el elemento en sí como un submenú, a continuación, añadir 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)); : : 

Esta es una respuesta completa que se basa en la idea de utilizar 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 utilizará 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.

La mejor manera de hacer esto es en su archivo de menú xml. Puede hacerlo 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 de trabajo completo para un menú con dos opciones, cada una de las cuales es un menú con tres opciones. Tengo la intención de añadir 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> 

Debe considerar utilizar 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(); } } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.