2011-07-13 12 views
13

tengo Menultem define de esta manera:MenuItem de comprobar el estado no se muestra correctamente por su icono

<?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 define 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> 

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

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

El método onOptionsItemSelected() se está llamando correctamente y que puede cambiar con éxito la propiedad verificado:

@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 ser cambiado, pero el icono de sí mismo no se actualiza para reflejar la correcta estado.

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

+0

me encontré con el mismo, el state_checked no funciona para los iconos del menú por alguna razón – gregm

Respuesta

31

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

Nota: Los elementos de menú en el menú de iconos (en el menú Opciones) no puede pantalla un botón de opción o casilla de verificación. Si elige hacer elementos en el Menú de iconos seleccionable, debe indicar manualmente el estado marcado por intercambiando el icono y/o el texto cada vez que cambie el estado.

Espero que ayude.

+0

Ah, no sé cómo me perdí - he leído a través de la documentación que un par de veces. ¡Gracias! –

+0

La parte más confusa para mí es que al agregar 'checkable =" true "' agrega una casilla de verificación al elemento del menú, y esta advertencia solo parece aplicarse a los elementos del menú en el menú de iconos en lugar de a todos los menús. – Flimm

10

Si aún quieren tener el comportamiento (comprobado, no marcado) definida en un dibujable XML, esta es una forma de poder 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()); 
} 
+0

¿Qué es 'R.drawable.selector_drawable'? – Flimm

+0

El dibujo xml que contiene múltiples estados (enfocado, presionado, etc.). En el ejemplo anterior, sería 'btn_star.xml' –

4

Un poco más simple forma (sin archivo XML-estados):

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

¿Por qué es necesaria la variable' configChecked'? – Flimm

+0

Flimm, porque tiene que cambiarlo a valor opuesto cada vez que haga clic en la casilla de verificación – kolyaseg

Cuestiones relacionadas