Ответ 1
state_focused
- всякий раз, когда кнопка фокусируется на использовании dpad или трекбола. При использовании прикосновений в представлении обычно не отображается сфокусированное состояние.
Я хочу, чтобы фон 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>
state_focused
- всякий раз, когда кнопка фокусируется на использовании dpad или трекбола. При использовании прикосновений в представлении обычно не отображается сфокусированное состояние.
здесь пример состояний кнопок:
fonte: http://developer.android.com/design/style/touch-feedback.html
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" , если этот элемент должен использоваться, когда окно приложения не имеет фокуса (например, если оттенок уведомления вытащили или появилось диалоговое окно).
Я знаю это поздно, из документа
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, чтобы представить нарисованный с длинным нажатием пользовательский интерфейс.
Чтобы изменить цвет фона кнопки и сделать его постоянным после нажатия, вам просто нужно:
Например, в 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!
Удачи!