2009-10-07 15 views
98

Estoy intentando anular la apariencia predeterminada de ToggleButton. Aquí está el código XML que define la ToggleButton:Android: especifique dos imágenes diferentes para togglebutton utilizando XML

<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 30 x 30 iconos que queremos usar para los estados ha hecho clic/no hace clic. En este momento tenemos código que cambia mediante programación el icono de fondo en función del 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. He tratado de hacer un selector de la imagen de fondo, lo que cambia 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; leer el ToggleButton API (http://developer.android.com/reference/android/widget/ToggleButton.html), parece que los únicos atributos XML son heredados

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 ser el androide: state_checked atributo, a pesar de tener la clase y el método isChecked()setChecked().

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

+0

Nota, si no está usando texto, creo que puede ser mejor usar 'CompoundButton'. – Timmmm

+1

Ignore eso; 'CompoundButton' es abstracto! – Timmmm

Respuesta

159

Su código es correcto. Sin embargo, el botón de alternar mostrará el primer elemento del 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> 
+3

Eso tiene perfecto sentido; Nunca hice la conexión entre el selector y las instrucciones de cambio. – I82Much

+0

Hiciste mi día ... tuve problemas con el botón, la casilla de verificación y luego intenté con el botón de opción, finalmente esta publicación fue útil. Muchas gracias Vitaly Polonetsky y I82Much –

+0

tu consejo realmente me ayuda. muchas gracias. – anticafe

Cuestiones relacionadas