Tener dos grupos de una sola selección en ActionBar no funciona, pero adjuntar un menú emergente en su lugar no funciona bien
Estoy escribiendo una aplicación de Android donde el usuario debe elegir cómo y qué mostrar en un gráfico. Estas opciones se expresan en dos grupos de menú de selección única (botones de radio), los cuales deben ser accesibles desde la barra de acción.
El primer grupo funciona bien. Se agrega al final de mi XML de ActionBar así:
- ¿Cómo crear una vista similar al área de notificación del sistema en android?
- ¿Puedo forzar la vista desplegable de una ruleta para permanecer visible en los cambios de orientación?
- Personalización del spinner de Actionbar
- Uso correcto de un Spinner, siguiendo las directrices de diseño del material
- Cómo crear el menú desplegable en un clic de botón
<group android:checkableBehavior="single" android:showAsAction="never" > <item android:id="@+id/menu_choice_1" android:title="Choice 1" /> <item android:id="@+id/menu_choice_2" android:title="Choice 2" android:checked="true"/> </group>
Sin embargo, cuando añado un segundo <group>
debajo del primero, los dos se combinan en una sola selección. En otras palabras, las opciones de ambas listas se procesan juntas y si elijo una opción perteneciente a la primera lista, no puedo elegir nada de la segunda.
En su lugar, quiero dos listas separadas de botones de radio. Mi siguiente idea fue añadir otro botón a la ActionBar que, al hacer clic, lanzaría un menú emergente . Pero cuando hago clic en el botón, obtengo una IllegalStateException
, diciendo que mi "MenuPopupHelper no se puede usar sin un ancla".
Aquí está mi código de menú emergente:
En mi XML de ActionBar:
<item android:id="@+id/menu_openothermenu" android:title="@string/openothermenustr" android:showAsAction="always" />
Mi nuevo menú XML:
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <group android:checkableBehavior="single"> <item android:id="@+id/menu_2_choice_1" android:title="@string/2_choice_1" /> <item android:id="@+id/menu_2_choice_2" android:title="@string/2_choice_2" android:checked="true"/> </group> </menu>
Código en mi actividad:
@Override public boolean onOptionsItemSelected(MenuItem item) { SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0); SharedPreferences.Editor editor; switch (item.getItemId()) { case R.id.openothermenu: Menu m = (Menu) findViewById(R.menu.other_menu); PopupMenu popup = new PopupMenu(this, findViewById(R.menu.main_menu)); popup.setOnMenuItemClickListener(this); MenuInflater inflater = popup.getMenuInflater(); inflater.inflate(R.menu.other_menu, popup.getMenu()); /* This commented block doesn't work either, and prevents execution // Restore saved chosen value int chosen = settings.getInt(MENU_2_PREFS, -1); switch(chosen) { case 1: m.findItem(R.id.menu_1_choice_1).setChecked(true); updateVisibleThings(); break; default: case 2: m.findItem(R.id.menu_2_choice_2).setChecked(true); updateOtherVisibleThings(); break; } */ popup.show(); return true; default: return super.onOptionsItemSelected(item); } } @Override public boolean onMenuItemClick(MenuItem item) { SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0); SharedPreferences.Editor editor; switch(item.getItemId()) { case R.id.menu_2_choice_1: if (item.isChecked()) item.setChecked(false); else item.setChecked(true); updateVisibleThings(); // save chosen setting editor = settings.edit(); editor.putInt(MENU_2_PREFS, 1); editor.commit(); // Commit the edits! return true; case R.id.menu_2_choice_2: if (item.isChecked()) item.setChecked(false); else item.setChecked(true); updateOtherVisibleThings(); // save chosen setting editor = settings.edit(); editor.putInt(MENU_2_PREFS, 2); editor.commit(); // Commit the edits! return true; default: return true; } }
¿Cómo puedo crear dos conjuntos de elementos de menú verificables de tal manera que ambos se adjunten a la ActionBar?
- La mejor manera de crear menú desplegable en android 2.x como en ICS
- ¿Cómo crear una lista desplegable?
- Android menú desplegable (sin girador!)
- Cómo personalizar el menú desplegable AutoCompleteTextView en Android
- Utilizar lista de matrices de objetos como adaptador de hiladora
- Android Dropdown (Seleccionar) CSS
- Spinner dropUP en lugar de dropDOWN android
- Menú desplegable o vista en diapositiva
Encontré una manera elegante de solucionar esto que desafortunadamente no estaba en la documentación. Agregue el código siguiente al menú XML de ActionBar:
<item android:id="@+id/menu_openothermenu" android:title="@string/openothermenustr" android:showAsAction="always"> <menu> <group android:checkableBehavior="single"> <item android:id="@+id/menu_2_choice_1" android:title="@string/2_choice_1" android:showAsAction="never" /> <item android:id="@+id/menu_2_choice_2" android:title="@string/2_choice_2" android:showAsAction="never" android:checked="true" /> </group> </menu> </item>
No es necesario ningún código de manejador adicional ni implementación del menú emergente para que aparezca un menú de este tipo.
- Cambiar el fondo de la actividad del código
- Android: cómo arreglar gps con simulacros (falso) de coordenadas?