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 х 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_ provje не здається, незважаючи на те, що клас має метод isChecked()та setChecked().

Отже, чи є спосіб зробити те, що я хочу в XML, або я застряг у своєму брудному вирішенні?


Зауважте, якщо ви не використовуєте текст, я думаю, це може бути краще використовувати CompoundButton.
Timmmm

1
Нехтуйте цим; CompoundButtonабстрактно!
Тиммммм

Відповіді:


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
Це має ідеальний сенс; Я ніколи не робив зв'язку між операторами селектора та комутатора.
I82Муч

Ви зробили мій день ... У мене виникли проблеми з кнопкою, прапорцем, а потім спробували і радіо кнопку, нарешті ця публікація була корисною. Дуже дякую Віталію Полонецькому та I82Much
David

8
Документація десь говорить про те, що вона читається зверху, зупиняючись на першому стані, умови якого всі дотримані, тож якщо за замовчуванням знаходиться вгорі, воно ніколи не омине цього шаблону.
Тревіс

1
@ I82Much a switchзавжди вибирав би "правильний" незалежно від порядку, це поводиться більше як тривалий if-elseif-elseif-elseз такими умовами state_x == true && state_y == false && state_z = true.
TWiStErRob
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.