programacion - inflar menu android
¿Cómo crear una instancia de menú programáticamente? es decir, inflar un menú fuera de CreateOptionsMenu (4)
Aquí hay un truco para obtener una instancia de Menú:
PopupMenu p = new PopupMenu(getContext(), null);
Menu menu = p.getMenu();
Quiero inflar un objeto de menú fuera del método onCreateOptionsMenu
(que significa crear / mostrar el menú cuando el usuario no presiona el botón), así que necesito crear una instancia de menú para pasarlo al método de inflar.
Aquí hay un ejemplo de lo que estoy tratando de lograr:
Menu menu = // How to create an instance !?
new MenuInflater(context).inflate(R.menu.my_menu, menu)
El menú es una interfaz, así que necesito saber qué clase lo está implementando. Revisé el código de Android para obtener una pista sobre cómo se crea un objeto de menú, pero aún no pude encontrar lo que estoy buscando.
Editar 1
Mi objetivo es onOptionsItemSelected(MenuItem item)
un onOptionsItemSelected(MenuItem item)
desde una vista personalizada, que será manejada por la actividad, por lo que necesito tener un objeto MenuItem con itemId y título específicos para pasarlo con el evento.
Si puedo crear con éxito un objeto de menú, será fácil obtener sus hijos MenuItems.
Editar 2
No estoy tratando de mostrar un menú, lo que quiero es llenar un ListView con elementos definidos en un menú XML que tenga título, ícono y itemId y cada vez que se haga clic en ListViewItem quiero disparar un onOptionsItemSelected(MenuItem item)
eso se maneja en mi actividad.
Sé que puedo analizar el XML del menú para extraer información de los elementos, sin embargo, no podré onOptionsItemSelected(MenuItem item)
sin crear un objeto MenuItem estándar para pasarlo como argumento.
Cualquier ayuda será apreciada. ¡Gracias!
Encontré dos soluciones para crear programáticamente una instancia de menú e inflarla:
Utilizando la biblioteca ActionbarSherlock o la biblioteca AppCompat v7
Menu menu = new MenuBuilder(context);
o puedes escribir tu propia clase deMenuBuilder
Usando SDK estándar de Android:
// Creando una instancia por reflexión
Menu menu = newMenuInstance(context);
protected Menu newMenuInstance(Context context) {
try {
Class<?> menuBuilderClass = Class.forName("com.android.internal.view.menu.MenuBuilder");
Constructor<?> constructor = menuBuilderClass.getDeclaredConstructor(Context.class);
return (Menu) constructor.newInstance(context);
} catch (Exception e) {e.printStackTrace();}
return null;
}
Una vez que tiene una instancia de menú, puede inflarla fácilmente desde un recurso XML de menú en cualquier parte de su programa.
new MenuInflater(context).inflate(menuId, menu);
Probé ambos métodos y están funcionando perfectamente, recomendaría usar el segundo método con el Menu
estándar y las clases MenuItem
del SDK de Android incluso si tu actividad amplía SherlockActivity porque todavía recibirá onOptionsItemSelected(MenuItem item)
independientemente de si lo onOptionsItemSelected(MenuItem item)
con android.view.MenuItem
o com.actionbarsherlock.view.MenuItem
No necesita hacer nada con el inflador para agregar sus propios menús. Simplemente anule onCreateOptionsMenu
y comience a agregar sus propios elementos en el objeto del menú . Por ejemplo:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
menu.add(0, 1, Menu.NONE, "First");
menu.add(0, 2, Menu.NONE, "Second");
// repeat this to add additional menus
return true;
}
El segundo argumento en el método add es el id
. Use identificadores únicos para identificar su elemento de menú seleccionado.
Puede extraer una instancia de MenuBuilder (que implementa la interfaz de menú) almacenada en PhoneWindow que se está utilizando en Activity. Tengo una solución de trabajo, utiliza Java Reflection.
Creé un proyecto "InDroid" para exponer algunos métodos ocultos importantes, variables de la plataforma Android: http://code.google.com/p/indroid/
BR, Prasanta