Android: specifica due immagini diverse per il pulsante di attivazione / disattivazione utilizzando XML


100

Sto tentando di sovrascrivere l' ToggleButtonaspetto predefinito . Ecco l'XML che definisce 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"/>

Ora abbiamo due icone 30 x 30 che vogliamo usare per gli stati cliccato / non cliccato. In questo momento abbiamo codice che modifica a livello di programmazione l'icona dello sfondo a seconda dello stato:

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

Ovviamente sto cercando un modo migliore per farlo. Ho provato a creare un selettore per l'immagine di sfondo, che passerebbe automaticamente tra gli stati:

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

Ma questo non funziona; leggendo l' ToggleButtonAPI ( http://developer.android.com/reference/android/widget/ToggleButton.html ), sembra che gli unici attributi xml ereditati siano

    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. 

Non sembra esserci l'attributo android: state_checked, nonostante la classe abbia il metodo isChecked()e setChecked().

Quindi, c'è un modo per fare quello che voglio in XML o sono bloccato con la mia soluzione alternativa?


Nota, se non stai usando il testo, penso che potrebbe essere meglio usare CompoundButton.
Timmmm

1
Ignorarlo; CompoundButtonè astratto!
Timmmm

Risposte:


159

Il tuo codice va bene. Tuttavia, il pulsante di attivazione / disattivazione visualizzerà il primo elemento nel selettore che corrisponde, quindi l'impostazione predefinita dovrebbe essere l'ultima. Disporre gli articoli nel modo seguente per assicurarsi che vengano utilizzati tutti:

<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
Questo ha perfettamente senso; Non ho mai effettuato la connessione tra selector e switch statement.
I82 Molto

Mi hai reso la giornata ... Ho avuto problemi con il pulsante, la casella di controllo e poi ho provato anche il pulsante di opzione, finalmente questo post è stato utile. Grazie mille Vitaly Polonetsky e I82Much
David Prun

8
la documentazione da qualche parte dice che legge dall'alto, fermandosi al primo stato le cui condizioni sono tutte soddisfatte, quindi se il valore predefinito è all'inizio, non supererà mai quel disegnabile.
Travis

1
@ I82Molto switchselezionerebbe sempre quello "giusto" indipendentemente dall'ordine, questo si comporta più come un lungo if-elseif-elseif-elsecon condizioni simili state_x == true && state_y == false && state_z = true.
TWiStErRob
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.