Разный фон для состояний кнопки в Kotlin - PullRequest
2 голосов
/ 27 мая 2020

В моем проекте есть кнопка, которая работает следующим образом:

Кнопка имеет 3 разных дизайна для каждого состояния - отключено (state_enabled="false"), включено, нажато.

Эта кнопка остается неактивной, если файл не выбран, и имеет особый дизайн. Хотя при выборе файла эта кнопка становится активной и переключается на другой дизайн. И цвет выделения кнопки можно увидеть каждый раз, когда кнопка активирована и нажата.

То, что я пробовал до сих пор:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/background_blue" android:state_enabled="true" />
    <item android:drawable="@drawable/background_blue_white" android:state_enabled="false" />
    <item android:drawable="@drawable/background_green" android:state_pressed="true" />

</selector>

Я хочу получить:

  1. Отключено: Click here to see the disabled button - означает, что я не могу щелкнуть по нему, пока не выбран файл.

  2. Включено: Click here to see the enabled button] - означает, что я выбрал файл.

  3. Нажата: enter image description here - означает, если кнопка включена и я нажимаю на нее.

state_enabled="false" и state_enabled="true" работают нормально, тогда как state_pressed="true" не работает вообще. Как вы думаете, что я делаю не так?

Пожалуйста, дайте мне знать, если мои объяснения сложны - я постараюсь описать проблему, чтобы она была как можно более понятной. Огромное спасибо. Хорошего дня!

Ответы [ 3 ]

1 голос
/ 27 мая 2020

Возможно, вам следует установить цвет по умолчанию.

<item android:drawable="@drawable/background_blue" android:state_enabled="true" />
<item android:drawable="@drawable/background_blue_white" android:state_enabled="false" />
<item android:drawable="@drawable/background_green" android:state_pressed="true" />
<item android:drawable="@drawable/background_blue" />

Цвет по умолчанию без каких-либо «нажатых» и «включенных» доступных для рисования.

1 голос
/ 28 мая 2020

Селектор выберет первый элемент, соответствующий текущему состоянию.

Из документации :

Примечание : помните, что Android применяет первый элемент в списке состояний, который соответствует текущему состояние объекта. Итак, если первый элемент в списке не содержит ни одного из указанных выше атрибутов состояния, он применяется каждый раз, поэтому значение по умолчанию всегда должно быть последним (как показано в следующем примере).

Нажатая кнопка также включена, поэтому ваш селектор по-прежнему выбирает состояние «включено», а не состояние «нажато», потому что оно было определено ранее.

Вы можете попробовать изменить порядок, чтобы исправить вашу проблему:

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/background_green" android:state_pressed="true" />  <!-- pressed -->
    <item android:drawable="@drawable/background_blue_white" android:state_enabled="false" />  <!-- disabled -->
    <item android:drawable="@drawable/background_blue" />  <!-- default -->

</selector>

Чтобы избежать подобной путаницы в будущем, хороший подход состоит в том, чтобы c быть более конкретным, чтобы одновременно совпадал только один элемент.
Эти элементы используют исходный порядок, но только один будет соответствовать за раз:

    <item android:drawable="@drawable/background_blue" android:state_enabled="true" android:state_pressed="false" />
    <item android:drawable="@drawable/background_blue_white" android:state_enabled="false" android:state_pressed="false"  />
    <item android:drawable="@drawable/background_green" android:state_enabled="true" android:state_pressed="true" />

(обратите внимание, что было бы лучше иметь значение по умолчанию внизу, потому что теперь технически возможно, что нет совпадение)

0 голосов
/ 27 мая 2020

Для этого нужно сделать свою кнопку clickable.

Вы можете сделать это с помощью button.setClickable(true) (если вы используете JAVA) или можете добавить в свой .xml вместо android:clickable="true".

Если вы используете Kotlin, добавьте button.clickable = true вместо первого решения с кодом Java.

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

Попробуйте и дайте мне знать, поможет ли это вам. Спасибо и удачного кодирования ..!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...