【问题标题】:Different background for a button's states in KotlinKotlin 中按钮状态的不同背景
【发布时间】:2020-09-14 05:57:07
【问题描述】:

我的项目中有一个按钮,其工作方式如下:

每个状态的按钮都有 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. 已禁用: - 表示除非选择了文件,否则我无法单击它。

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

  3. Pressed: - 表示按钮是否启用并且我按下它。

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

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

【问题讨论】:

  • 也检查更新的答案。谢谢。
  • 很高兴为您提供帮助。编码快乐..!

标签: android xml kotlin button drawable


【解决方案1】:

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

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

没有任何“按下”和“启用”可绘制的默认颜色。

【讨论】:

  • 或者你设置一个“未按下的”drawable
  • 你好光!非常感谢你的回答。我已经尝试了您的建议,但进展不大,非常感谢。但是到目前为止,按钮的禁用状态看起来不像我想要的。我添加了屏幕截图以便更好地理解。
  • 在您的 Kotlin 文件中,您需要设置您的按钮“enabled =false”。“android:state_enabled”drawable 将起作用。 “button.enabled=false”
【解决方案2】:

选择器将选择与当前状态匹配的第一个项。

来自documentation

注意:请记住,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>

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

    <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 匹配是可能的)

【讨论】:

  • 嗨@RobCo!非常感谢你这么好的解释。从现在开始我会考虑的。 :)
【解决方案3】:

您应该为此设置按钮clickable

您可以使用button.setClickable(true)(如果您使用的是 JAVA)来制作它,或者您可以在您拥有android:clickable="true" 的地方添加.xml

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

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

试试这个,如果它对你有帮助,请告诉我。 谢谢,编码快乐..!

【讨论】:

  • 嗨普拉纳夫帕特尔!非常感谢您的回答!该按钮的“可点击”属性已设置为“真”。两种状态(启用真/假)正在改变,但按下状态没有显示所需的颜色。
  • 让我检查一下我是否会得到一些东西,我会更新我的答案。感谢理解。
  • 如果您可以从 .xml 共享您的按钮标签,那就太好了。
  • 你可以尝试一种改变可绘制样式的方法。在 style.xml 中添加样式并将其用于android:state_pressed
  • 即便如此,你也应该先尝试制作android:state_pressed="false"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-14
  • 2015-10-11
  • 2020-08-14
  • 1970-01-01
相关资源
最近更新 更多