Android: укажите два разных изображения для переключателя с помощью XML

100

Я пытаюсь изменить ToggleButtonвнешний вид по умолчанию . Вот XML, определяющий 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"/>

Теперь у нас есть два значка 30 x 30, которые мы хотим использовать для состояний с щелчком / без щелчка. Прямо сейчас у нас есть код, который программно меняет значок фона в зависимости от состояния:

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

Очевидно, я ищу лучший способ сделать это. Я попытался сделать селектор для фонового изображения, который автоматически переключался бы между состояниями:

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

Но это не работает; читая ToggleButtonAPI ( http://developer.android.com/reference/android/widget/ToggleButton.html ), кажется, что единственными унаследованными атрибутами xml являются

    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. 

Атрибут android: state_checked, похоже, отсутствует, несмотря на то, что у класса есть метод isChecked()и setChecked().

Итак, есть ли способ делать то, что я хочу в XML, или я застрял в своем беспорядочном обходном пути?

I82: много
источник
Обратите внимание: если вы не используете текст, я думаю, что лучше его использовать CompoundButton.
Timmmm
1
Не обращайте на это внимания; CompoundButtonабстрактно!
Timmmm

Ответы:

159

Ваш код в порядке. Однако кнопка переключения отобразит первый элемент в вашем селекторе, которому он соответствует, поэтому значение по умолчанию должно быть последним. Разложите предметы следующим образом, чтобы все они были использованы:

<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
В этом есть смысл; Я никогда не связывал операторов селектора и переключателя.
I82Much,
Вы сделали мой день ... У меня были проблемы с кнопкой, флажком, а затем я попробовал переключатель, наконец, этот пост был полезен. Большое спасибо Виталию Полонецкому и I82Much
Дэвид
8
где-то в документации говорится, что он читается сверху, останавливаясь в первом состоянии, все условия которого выполняются, поэтому, если по умолчанию находится наверху, он никогда не пройдет эту возможность.
Трэвис
1
@ I82Much a switchвсегда будет выбирать "правильный" независимо от порядка, это больше похоже на длинный if-elseif-elseif-elseс такими условиями, как state_x == true && state_y == false && state_z = true.
TWiStErRob