在Kotlin中,按钮的状态有不同的背景。

问题描述 投票:2回答: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. 停用 Click here to see the disabled button - 意思是我不能点击它,除非我选择了一个文件。

  2. 启用:意味着我已经选择了一个文件。Click here to see the enabled button] - 表示我已经选择了一个文件。

  3. 按下:表示我已经选择了一个文件。enter image description here - 意味着如果按钮被启用,并且我按下了它。

state_enabled="false"state_enabled="true" 行得通,而 state_pressed="true" 不工作在所有。你认为我做错了什么?

如果我的解释很复杂,请告诉我--我会尽最大努力描述问题,让它尽可能地易于理解。非常感谢您。祝你有个愉快的一天

android xml kotlin button drawable
3个回答
0
投票

你应该让你的按钮 clickable 的。

你可以用 button.setClickable(true)(如果你使用的是JAVA),或者你可以将你的 .xml 你有 android:clickable="true".

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

更新。 你也应该试试这个东西. 按照 本回答 也许会有帮助。按照这个答案,你应该把所有的状态保持在适当的顺序。我不知道为什么,但我认为这应该有帮助。

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


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

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


1
投票

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

文件:

说明:: 记住,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" />

(请注意,最好在底部有一个默认值,因为现在技术上有可能是: 匹配)

© www.soinside.com 2019 - 2024. All rights reserved.