当可点击为假时更改按钮的背景颜色
Posted
技术标签:
【中文标题】当可点击为假时更改按钮的背景颜色【英文标题】:Change background color of Button when clickable is false 【发布时间】:2013-04-07 13:36:23 【问题描述】:当程序员在 XML 布局文件中指定按钮不可点击时,我试图通过选择器更改按钮的颜色。 IE。 android:clickable="false"
这是我当前的选择器 xml 文件,它似乎无法正常工作。
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_enabled="false">
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#FF00FF"/>
<corners
android:bottomRightRadius="16dp"
android:bottomLeftRadius="16dp"
android:topRightRadius="16dp"
android:topLeftRadius="16dp"/>
</shape>
</item>
<item android:state_pressed="true">
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#CDAF95"/>
<corners
android:bottomRightRadius="16dp"
android:bottomLeftRadius="16dp"
android:topRightRadius="16dp"
android:topLeftRadius="16dp"/>
</shape>
</item>
<item>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#D2B48C"/>
<corners
android:bottomRightRadius="16dp"
android:bottomLeftRadius="16dp"
android:topRightRadius="16dp"
android:topLeftRadius="16dp"/>
【问题讨论】:
删除形状标签的命名空间属性...即删除此xmlns:android="http://schemas.android.com/apk/res/android"
【参考方案1】:
很遗憾,StateListDrawable
没有 state_clickable
属性。您可以通过两种方式解决问题:
-
在调用
setClickable()
时更改视图的背景。
介绍您自己的state_clickable
选择器状态。
如果您更喜欢第二种方式,则需要在项目中添加以下更改:
attrs.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="ClickableState">
<attr name="state_clickable" format="boolean" />
</declare-styleable>
</resources>
MyButton.java
private static final int[] STATE_CLICKABLE = R.attr.state_clickable;
@Override
protected int[] onCreateDrawableState(final int extraSpace)
if (isClickable())
final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
mergeDrawableStates(drawableState, STATE_CLICKABLE);
return drawableState;
else
return super.onCreateDrawableState(extraSpace);
@Override
public void setClickable(final boolean clickable)
super.setClickable(clickable);
refreshDrawableState();
background.xml
<selector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:auto="http://schemas.android.com/apk/res-auto">
<item auto:state_clickable="false">
<!-- non-clickable shape here -->
</item>
<!-- other shapes -->
</selector>
但是这个解决方案有一个非常明显的弱点。如果您想在不同的视图类中使用此状态,则必须对这些类进行子类化并将MyButton.java
中的代码添加到它们。
【讨论】:
你怎么知道 setClickable 什么时候被调用了? 您的意思是第二种解决方案吗?你重写setClickable()
方法,这就是你现在的方式。以上是关于当可点击为假时更改按钮的背景颜色的主要内容,如果未能解决你的问题,请参考以下文章