web-dev-qa-db-fra.com

Android: spécifiez deux images différentes pour le bouton à bascule à l'aide de XML

J'essaie de remplacer l'apparence par défaut de ToggleButton. 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"/>

Nous souhaitons maintenant utiliser deux icônes 30 x 30 pour les états cliqué/non cliqué. À l'heure actuelle, nous avons un code qui modifie par programme 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));
            }
        }
});

Évidemment, je cherche un meilleur moyen de le faire. J'ai essayé de faire un sélecteur pour l'image de fond, qui basculerait automatiquement entre les états:

 <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 ça ne marche pas. En lisant 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 exister d'attribut Android: state_checked, malgré le fait que la classe utilise la méthode isChecked() et setChecked().

Alors, y at-il un moyen de faire ce que je veux en XML, ou suis-je coincé avec ma solution de travail désordonnée?

99
I82Much

Votre code est bon. Cependant, le bouton bascule affichera le premier élément de votre sélecteur auquel il correspond, de sorte que le paramètre par défaut doit être utilisé en dernier. Disposez 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>
159
m_vitaly