27

我希望按钮背景在单击按钮后保持某种颜色,并在按下其他按钮时再次更改颜色。我认为这是“state_focused”状态。

但是我的 Button 似乎只有两种状态是按下或未按下。

我是否正确理解 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>
4

5 回答 5

45

state_focused每当按钮专注于使用 dpad 或轨迹球时。使用触摸时,视图通常不会显示聚焦状态。

于 2012-01-13T15:01:00.303 回答
35

这里有一个按钮状态示例:

在此处输入图像描述

字体:http : //developer.android.com/design/style/touch-feedback.html

于 2012-01-13T15:00:40.123 回答
18

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

android:state_pressed
布尔值。如果在按下对象时(例如触摸/单击按钮时)应使用此项目,则为“true”;如果此项应在默认的非按下状态下使用,则为“false”。

android:state_focused
布尔值。如果当对象具有输入焦点时(例如当用户选择文本输入时)应使用此项目,则为“true”;如果此项应在默认的非聚焦状态下使用,则为“false”。

android:state_hovered
布尔值。如果在对象被光标悬停时应使用此项目,则为“true”;"false" 如果此项应在默认的非悬停状态下使用。通常,此可绘制对象可能与用于“聚焦”状态的可绘制对象相同。
在 API 级别 14 中引入。

android:state_selected
布尔值。如果在使用方向控件导航时(例如使用 d-pad 导航列表时)对象是当前用户选择,则应使用此项目;如果在未选择对象时应使用此项目,则为“false”。
当焦点 (android:state_focused) 不够时(例如当列表视图具有焦点并且使用 d-pad 选择其中的项目时)使用选定状态。

android:state_checkable
布尔值。如果在对象可检查时应使用此项目,则为“true”;如果在对象不可检查时应使用此项目,则为“false”。(仅当对象可以在可检查和不可检查小部件之间转换时才有用。)

android:state_checked
布尔值。如果在检查对象时应使用此项目,则为“true”;如果在对象未选中时应使用它,则为“false”。

android:state_enabled
布尔值。"true" 如果在启用对象时应使用此项目(能够接收触摸/点击事件);如果在禁用对象时应该使用它,则为“false”。

android:state_activated
布尔值。"true" 如果在对象被激活为持久选择时应使用此项目(例如在持久导航视图中“突出显示”先前选择的列表项);如果在对象未激活时使用,则为“false”。
在 API 级别 11 中引入。

android:state_window_focused
布尔值。如果在应用程序窗口有焦点(应用程序在前台)时使用此项,则为“true”,如果在应用程序窗口没有焦点时(例如,如果通知阴影为下拉或出现对话框)。

于 2012-01-13T15:05:12.963 回答
0

我知道已经很晚了,来自doco

android:state_focused

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

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

根据我的测试,焦点是当用户使用“下一个/上一个”UI 导航到 UI 元素时,例如在软键盘或远程控制设备 (Android TV) 上,或者当用户触摸并按住按钮时没有释放它。我必须使用 state_pressed=true 和 state_focused=true 来呈现一个长按 UI 可绘制对象。

于 2018-05-08T01:15:40.027 回答
0

要更改按钮的背景颜色并在被点击后使其持久化,您只需:

  1. 创建一个 ColorStateSelector XML 文件
  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's 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"
            ... />

科特林文件:

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!

祝你好运!

于 2019-08-22T17:30:01.300 回答