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