Próbuję zastąpić domyślny ToggleButton
wyglą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 ToggleButton
API ( 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?
źródło
CompoundButton
.CompoundButton
jest abstrakcyjne!Odpowiedzi:
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:
źródło
switch
zawsze wybierze „właściwy”, niezależnie od kolejności, zachowuje się to bardziej jak długiif-elseif-elseif-else
z warunkami takimi jakstate_x == true && state_y == false && state_z = true
.