Kotlin 中按钮状态的不同背景

Different background for a button's states in Kotlin

我的项目中有一个按钮是这样工作的:

该按钮针对每种状态有 3 种不同的设计 - 禁用 (state_enabled="false")、启用、按下。

如果未选择任何文件,此按钮将保持禁用状态,并且具有特殊设计。 Although, when file is selected, this button becomes enabled and switches to a different design.每次启用和按下按钮时,都可以看到按钮的突出显示颜色。

到目前为止我尝试过的:

<?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. 已禁用: - 意味着除非我选择了一个文件,否则我无法点击它。

  2. 已启用: - 表示我选择了一个文件。

  3. 按下: - 表示如果按钮已启用并且我按下它。

state_enabled="false"state_enabled="true" 工作得很好,而 state_pressed="true" 根本不起作用。你认为我做错了什么?

如果我的解释很复杂,请告诉我 - 我会尽力描述问题,使其尽可能易于理解。太感谢了。祝你今天过得愉快!

您应该为此制作按钮 clickable

您可以使用 button.setClickable(true)(如果您使用的是 JAVA)或者您可以在 .xml 中添加 android:clickable="true"

如果您使用的是 Kotlin,则添加 button.clickable = true 而不是使用 Java 代码的第一个解决方案。

更新: 你也应该试试这个东西。关注 this answer 可能会有帮助。 根据该答案,您应该使所有状态保持正确的顺序。我不知道为什么,但我认为它应该有所帮助。

试试这个,让我知道它是否对你有帮助。 谢谢,编码愉快..!

也许你应该设置一个默认颜色。

<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" />

没有任何 "pressed" 和 "enabled" 可绘制的默认颜色。

一个 select 或将 select 第一个 匹配当前状态的项目。

来自documentation

Note: Remember that Android applies the first item in the state list that matches the current state of the object. So, if the first item in the list contains none of the state attributes above, then it is applied every time, which is why your default value should always be last (as demonstrated in the following example).

按下的按钮也已启用,因此您的 selector 仍会选择 'enabled' 状态而不是 'pressed' 状态,因为它是较早定义的。

您可以尝试调整顺序来解决您的问题:

<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>

为了避免将来出现这样的混淆,一个好的方法是更加具体,这样一次只有一个项目匹配。
这些项目使用原始顺序,但一次只会匹配一个:

    <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" />

(请注意,最好在底部设置一个默认值,因为现在技术上可以匹配 none