Android: określ dwa różne obrazy dla togglebutton za pomocą XML

100

Próbuję zastąpić domyślny ToggleButtonwygląd. Oto kod XML, który definiuje 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"/>

Teraz mamy dwie ikony 30 x 30, których chcemy użyć dla stanów klikniętych / nieklikniętych. W tej chwili mamy kod, który programowo zmienia ikonę tła w zależności od stanu:

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

Oczywiście szukam lepszego sposobu, aby to zrobić. Próbowałem utworzyć selektor obrazu tła, który automatycznie przełączałby się między stanami:

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

Ale to nie działa; czytając ToggleButtonAPI ( http://developer.android.com/reference/android/widget/ToggleButton.html ), okazuje się, że jedynymi dziedziczonymi atrybutami xml są

    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. 

Wygląda na to, że nie ma atrybutu android: state_checked, mimo że klasa ma metodę isChecked()i setChecked().

Czy jest więc sposób na zrobienie tego, co chcę w XML, czy też utknąłem z moim niechlujnym obejściem?

I82 Dużo
źródło
Uwaga, jeśli nie używasz tekstu, myślę, że będzie lepiej CompoundButton.
Timmmm
1
Zignoruj ​​to; CompoundButtonjest abstrakcyjne!
Timmmm

Odpowiedzi:

159

Twój kod jest w porządku. Jednak przycisk przełączania wyświetli pierwszy element w selektorze, do którego pasuje, więc wartość domyślna powinna być ostatnia. Ułóż elementy w następujący sposób, aby mieć pewność, że zostaną wykorzystane:

<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
źródło
3
To ma sens; Nigdy nie utworzyłem połączenia między instrukcjami selector i switch.
I82Much
Zrobiłeś mój dzień ... Miałem problemy z przyciskiem, polem wyboru, a potem wypróbowałem również przycisk opcji, w końcu ten post był pomocny. Dziękuję bardzo Witalijowi Polonetskiemu i I82Much
David Prun
8
gdzieś w dokumentacji jest napisane, że czyta od góry, zatrzymując się na pierwszym stanie, którego wszystkie warunki są spełnione, więc jeśli wartość domyślna znajduje się na górze, to nigdy nie wyjdzie poza ten możliwy do rysowania.
Travis,
1
@ I82Wiele a switchzawsze wybierze „właściwy”, niezależnie od kolejności, zachowuje się to bardziej jak długi if-elseif-elseif-elsez warunkami takimi jak state_x == true && state_y == false && state_z = true.
TWiStErRob