tutorial studio programacion móviles menus español ejemplos dinamico desarrollo curso aplicaciones android menu menuitem android-actionbar

programacion - menu dinamico android studio



El estado marcado de MenuItem no se muestra correctamente con su icono (3)

Tengo MenuItem definido de esta manera:

<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/menu_starred" android:icon="@drawable/btn_star" android:title="@string/description_star" android:checkable="true" android:checked="true" android:orderInCategory="1" android:showAsAction="always" /> </menu>

y btn_star.xml definido de esta manera:

<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_checked="false" android:drawable="@drawable/btn_star_off_normal" /> <item android:state_checked="true" android:drawable="@drawable/btn_star_on_normal" /> </selector>

Sin embargo, cuando creo un menú de opciones usando esto, el ícono nunca se muestra en estado comprobado, incluso si la propiedad isChecked() MenuItem es verdadera.

Estoy usando el control ActionBarSherlock , sin embargo, estoy obteniendo el mismo resultado si simplemente creo un menú de opciones normal y llamo a setChecked(true) . Todavía muestra el btn_star_off independientemente del estado verificado del artículo.

El método onOptionsItemSelected() se está llamando correctamente y puedo cambiar correctamente la propiedad marcada:

@Override public boolean onOptionsItemSelected(MenuItem item) { if(item.isCheckable()) { item.setChecked(!item.isChecked()); } return super.onOptionsItemSelected(item); }

Establecer un punto de interrupción aquí muestra la propiedad isChecked que se está modificando, pero el icono en sí no se actualiza para reflejar el estado correcto.

¿Hay algo que me falta aquí? ¿Estoy haciendo esto incorrectamente? No puedo entender por qué esto no estaría funcionando correctamente.


De acuerdo con el documento oficial en http://developer.android.com/guide/topics/ui/menus.html

Nota: los elementos del menú en el menú de iconos (del menú de opciones) no pueden mostrar una casilla de verificación o un botón de opción. Si elige hacer que los elementos en el Menú de icono sean seleccionables, debe indicar manualmente el estado verificado intercambiando el icono y / o el texto cada vez que cambie el estado.

Espero eso ayude.


Si aún desea que el comportamiento (marcado, no marcado) se defina en un xml dibujable, esta es una manera en que podría lograr esto:

if (item.getItemId()==R.id.menu_item){ item.setChecked(!item.isChecked()); StateListDrawable stateListDrawable = (StateListDrawable) getResources().getDrawable(R.drawable.selector_drawable); int[] state = {item.isChecked()?android.R.attr.state_checked:android.R.attr.state_empty}; stateListDrawable.setState(state); item.setIcon(stateListDrawable.getCurrent()); }


Una forma un poco más simple (sin archivo xml-states):

configChecked = !configChecked; item.setChecked(configChecked); item.setIcon(configChecked ? R.drawable.check_on : R.drawable.check_off);