Android: especifique dos imágenes diferentes para el botón de alternancia usando XML

100

Estoy intentando anular la ToggleButtonapariencia predeterminada . Aquí está el XML que define ToggleButton:

<ToggleButton android:id="@+id/FollowAndCenterButton"
        android:layout_width="30px"
        android:layout_height="30px"
        android:textOn="" android:textOff="" android:layout_alignParentLeft="true"
        android:layout_marginLeft="5px"
        android:layout_marginTop="5px" android:background="@drawable/locate_me"/>

Ahora, tenemos dos iconos de 30 x 30 que queremos usar para los estados en los que se hizo clic o no. Ahora mismo tenemos un código que cambia programáticamente el icono de fondo según el estado:

centeredOnLocation.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            if (centeredOnLocation.isChecked()) {
                centeredOnLocation.setBackgroundDrawable(getResources().getDrawable(R.drawable.locate_me_on));
            } else {
                centeredOnLocation.setBackgroundDrawable(getResources().getDrawable(R.drawable.locate_me));
            }
        }
});

Obviamente, estoy buscando una mejor manera de hacer esto. Intenté hacer un selector para la imagen de fondo, que cambiaría automáticamente entre los estados:

 <selector xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:drawable="@drawable/locate_me" /> <!-- default -->
 <item android:state_checked="true"
       android:drawable="@drawable/locate_me_on" /> <!-- pressed -->
 <item android:state_checked="false"
       android:drawable="@drawable/locate_me" /> <!-- unchecked -->

Pero esto no funciona; leyendo la ToggleButtonAPI ( http://developer.android.com/reference/android/widget/ToggleButton.html ), parece que los únicos atributos xml heredados son

    XML Attributes
Attribute Name  Related Method  Description
android:disabledAlpha       The alpha to apply to the indicator when disabled. 
android:textOff         The text for the button when it is not checked. 
android:textOn      The text for the button when it is checked. 

No parece haber el atributo android: state_checked, a pesar de que la clase tiene el método isChecked()y setChecked().

Entonces, ¿hay alguna manera de hacer lo que quiero en XML, o estoy atascado con mi solución desordenada?

I82Mucho
fuente
Tenga en cuenta que si no está usando texto, creo que puede ser mejor usarlo CompoundButton.
Timmmm
1
Ignore eso; CompoundButtones abstracto!
Timmmm

Respuestas:

159

Tu código está bien. Sin embargo, el botón de alternancia mostrará el primer elemento de su selector que coincida, por lo que el valor predeterminado debería ser el último. Organice los elementos de la siguiente manera para asegurarse de que se utilizarán todos:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true" android:state_pressed="true" /> //currently pressed turning the toggle on
    <item android:state_pressed="true" /> //currently pressed turning the toggle off
    <item android:state_checked="true" /> //not pressed default checked state
    <item /> //default non-pressed non-checked
</selector>
m_vitaly
fuente
3
Eso tiene mucho sentido; Nunca hice la conexión entre las declaraciones selector y switch.
I82Much
Me alegraste el día ... Tuve problemas con el botón, la casilla de verificación y luego probé el botón de radio también, finalmente esta publicación fue útil. Muchas gracias Vitaly Polonetsky y I82Much
David Prun
8
la documentación en algún lugar dice que se lee desde arriba, deteniéndose en el primer estado cuyas condiciones se cumplen todas, por lo que si el valor predeterminado está en la parte superior, nunca pasará de ese dibujable.
Travis
1
@ I82Mucho switchsiempre seleccionaría el "correcto" independientemente del orden, esto se comporta más como un largo if-elseif-elseif-elsecon condiciones como state_x == true && state_y == false && state_z = true.
TWiStErRob