Подтвердить что ты не робот

Что такое состояние state_focused для кнопки?

Я хочу, чтобы фон Button оставался определенным цветом после нажатия кнопки и снова менял цвета при нажатии какой-либо другой кнопки. Я думал, что это состояние "state_focused".

Но только два состояния, которые, как мне кажется, для моей кнопки нажаты или не нажаты.

Правильно ли я понимаю состояние state_focused или неправильно ли указан мой StateListDrawable (см. ниже)?

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

    <item android:state_focused="true" android:state_pressed="false"><shape>
            <solid android:color="#00ff00" />
        </shape></item>
    <item android:state_pressed="true"><shape>
            <solid android:color="#ff0000" />
        </shape></item>
    <item><shape>
            <solid android:color="#0000ff" />
        </shape></item>

</selector>
4b9b3361

Ответ 1

state_focused - всякий раз, когда кнопка фокусируется на использовании dpad или трекбола. При использовании прикосновений в представлении обычно не отображается сфокусированное состояние.

Ответ 3

https://developer.android.com/guide/topics/resources/drawable-resource.html

android:state_pressed
Boolean. "true" , если этот элемент должен использоваться, когда объект нажат (например, когда кнопка нажата/нажата); "false" , если этот элемент должен использоваться в состоянии по умолчанию, не нажатом.

android:state_focused
Boolean. "true" , если этот элемент должен использоваться, когда объект имеет фокус ввода (например, когда пользователь выбирает текстовый ввод); "false" , если этот элемент должен использоваться в состоянии без фокусировки по умолчанию.

android:state_hovered
Boolean. "true" , если этот элемент должен использоваться, когда объект наводится курсором; "false" , если этот элемент должен использоваться в состоянии, не зависящем по умолчанию. Часто эта пригодная для тиражирования может быть одинаковой для использования в "сфокусированном" состоянии. Представлен в уровне API 14.

android:state_selected
Boolean. "true" , если этот элемент следует использовать, когда объект является текущим выбором пользователя при навигации с помощью направленного управления (например, при навигации по списку с помощью d-pad); "false" , если этот элемент должен использоваться, когда объект не выбран.
Выбранное состояние используется, когда фокус (android: state_focused) недостаточен (например, когда фокус списка имеет фокус, а элемент внутри него выбран с помощью d-pad).

android:state_checkable
Boolean. "true" , если этот элемент должен использоваться, когда объект можно проверить; "false" , если этот элемент должен использоваться, когда объект не может быть проверен. (Только полезно, если объект может перейти между проверяемым и не проверяемым виджетом.)

android:state_checked
Boolean. "true" , если этот элемент должен использоваться, когда объект проверен; "false" , если он должен использоваться, когда объект не проверен.

android:state_enabled
Boolean. "true" , если этот элемент должен использоваться, когда объект включен (способен получать события касания/клика); "false" , если он должен использоваться, когда объект отключен.

android:state_activated
Boolean. "true" , если этот элемент должен использоваться, когда объект активирован как постоянный выбор (например, чтобы "выделить" ранее выбранный элемент списка в режиме постоянной навигации); "false" , если он должен использоваться, когда объект не активирован.
Представлен в уровне API 11.

android:state_window_focused
Boolean. "true" , если этот элемент должен использоваться, когда окно приложения имеет фокус (приложение находится на переднем плане), "false" , если этот элемент должен использоваться, когда окно приложения не имеет фокуса (например, если оттенок уведомления вытащили или появилось диалоговое окно).

Ответ 4

Я знаю это поздно, из документа

Android: state_focused

State value for StateListDrawable, set when a view has input focus.

May be a boolean value, such as "true" or "false".

Из моего тестирования основное внимание уделяется тому, когда пользователь перешел к элементу пользовательского интерфейса с помощью "следующего/предыдущего" пользовательского интерфейса, как на программной клавиатуре, или устройства дистанционного управления (Android TV), или когда пользователь касается и удерживает нажатой клавишу кнопка, не отпуская ее. Мне пришлось использовать state_pressed = true и state_focused = true, чтобы представить нарисованный с длинным нажатием пользовательский интерфейс.

Ответ 5

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

  1. Создать XML файл ColorStateSelector
  2. Установите для свойства backgroundTint кнопки вышеупомянутый XML файл
  3. Установите состояние кнопки на желаемое и определенное в файле ColorState

Например, в Kotlin и Material Buttons:

Файл ColorStateSelector (res/color/buttons_color_state.xml):

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

    <!-- Red color for pressed state, the pressed state is changed back to normal button color after a certain short time, white in this case-->
    <item android:color="#FF1744" android:state_pressed="true" />

    <!-- Green color for this state, it reserved for persistent color change-->
    <item android:color="#00E676" android:state_selected="true" />

    <!-- White for neutral default state-->
    <item android:color="@android:color/white" />

</selector>

Макет XML:

<com.google.android.material.button.MaterialButton
            android:id="@+id/buttonOption"
            android:backgroundTint="@color/buttons_color_state.xml"
            ... />

Kotlin file:

val buttonOption = view?.findViewById<MaterialButton>(R.id.buttonOption)

// Implement any "if" checks or other control checks here if necessary
  buttonOption.isSelected = true
// now the button is Green!

Удачи!