99 votes

Android : Spécifier deux images différentes pour le bouton à bascule en utilisant XML

J'essaie de remplacer le système par défaut. ToggleButton apparence. Voici le XML qui définit le 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"/>

Maintenant, nous avons deux icônes de 30 x 30 que nous voulons utiliser pour les états cliqué/non cliqué. Actuellement, nous disposons d'un code qui modifie de manière programmatique l'icône d'arrière-plan en fonction de l'état :

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

Je cherche évidemment une meilleure façon de procéder. J'ai essayé de créer un sélecteur pour l'image d'arrière-plan, qui passerait automatiquement d'un état à l'autre :

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

Mais cela ne fonctionne pas ; la lecture de la ToggleButton API ( http://developer.Android.com/reference/Android/widget/ToggleButton.html ), il apparaît que les seuls attributs xml hérités sont

    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. 

Il ne semble pas y avoir l'attribut Android:state_checked, bien que la classe possède la méthode isChecked() y setChecked() .

Existe-t-il un moyen de faire ce que je veux en XML ou dois-je me contenter de ma solution de rechange désordonnée ?

159voto

Vitaly Polonetsky Points 5264

Votre code est bon. Cependant, le bouton de basculement affichera le premier élément de votre sélecteur auquel il correspond, de sorte que la valeur par défaut devrait venir en dernier. Organisez les éléments de la manière suivante pour vous assurer qu'ils seront tous utilisés :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X