Изменение состояния цвета на кнопке «ImageToggle»

#android #android-layout

#Android #android-макет

Вопрос:

В настоящее время у меня есть набор переключателей, заключенных в радиогруппу, при этом каждая кнопка ссылается на селектор, который изменяет цвет состояния кнопки, и пишет код для реализации поведения в виде радиокнопки. Это отлично работает. (РЕДАКТИРОВАТЬ: я должен упомянуть, что селектор — это то, на что ссылается элемент android: background кнопки)

Селектор выглядит примерно так

 <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:drawable="@color/gold"
              android:state_checked="true" />
        <item android:drawable="@color/white" />
    </selector>
  

Теперь я хочу, чтобы второй набор кнопок имел точно такое же поведение. Загвоздка в том, что на этот раз мне нужны изображения на некоторых из них, а не текст.

Есть много сообщений StackOverflow о том, как изменить изображение в зависимости от состояния кнопки, но я не хочу менять изображение в зависимости от состояния. Я хочу изменить цвет кнопки в зависимости от состояния (изображения имеют прозрачный фон).

Я действительно пытаюсь избежать изменения самих изображений кнопок.

Я считаю, что решение включает в себя создание селектора со списком слоев, но для меня это новая территория.

Ответ №1:

Создайте XML-файл с именем colors.xml в папке res/values:

 <?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="red">#ff0000</color>
    <color name="green">#00ff00</color>
</resources>
  

В папке с возможностью рисования создайте XML-файл my_btn_toggle.xml:

 <selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="false" android:drawable="@color/red"  />
    <item android:state_checked="true" android:drawable="@color/green"  />
</selector>
  

и в разделе xml определите свою кнопку переключения:

 <ToggleButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@ id/btntoggle"
    android:background="@drawable/my_btn_toggle"/>
  

Комментарии:

1. Это именно то, что я сейчас делаю с переключателями. Что мне нужно знать, так это то, где мне указать изображение, которое будет использоваться для кнопки? В настоящее время кнопки изображений ссылаются на них с помощью android: background. Если я отсылаю android: background к селектору, этот селектор должен каким-то образом сохранить ссылку на файл изображения … (и это мой вопрос … как мне это сделать?)

2. <xmlns селектора: android=» schemas.android.com/apk/res/android «> <элемент android:state_checked=»false» android:drawable=»@drawable/yourImagechecked» /> <элемент android:state_checked=»true» android: drawable=»@drawable/yourImagechecked» /> </селектор>

Ответ №2:

Комментарии:

1. Это было близко. Я не хотел, чтобы изображение смешивалось (тонировалось) с цветом оттенка. Вы даже можете указать метод наложения с помощью android: tintMode. Метод, на который я ответил, создает многоуровневый рисунок, где самый верхний слой — это то, что вы видите там, где оно написано. С тех пор я изменил его, чтобы создавать границы, используя <stroke>

Ответ №3:

Что, по-видимому, нужно сделать, так это создать многоуровневый рисунок в селекторе, подобный этому:

 <selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true">
        <layer-list>
            <item android:drawable="@color/gold"
                  android:gravity="fill"/>
            <item android:drawable="@drawable/image"
                  android:gravity="fill"/>
        </layer-list>
    </item>

    <item android:state_checked="false">
        <layer-list>
            <item android:drawable="@color/white"
                  android:gravity="fill"/>
            <item android:drawable="@drawable/image"
                  android:gravity="fill"/>
        </layer-list>
    </item>
</selector>
  

Стандартный подход к селекторам кнопок с переменным состоянием — это то, о чем упоминал Приянк выше. Просто изображение должно быть прозрачным и объявлено, как указано выше, таким образом, чтобы оно было покрыто фоновым цветом для изменения состояния цвета