我试图在XML布局文件中通过选择器更改按钮的颜色,程序员指定该按钮不可点击。即。 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"/>
答案 0 :(得分:3)
不幸的是,state_clickable
没有StateListDrawable
属性。您可以通过两种方式解决问题:
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
中的代码添加到它们中。