当clickable为false时更改Button的背景颜色

时间:2013-04-07 13:36:23

标签: android button view

我试图在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"/>

    

1 个答案:

答案 0 :(得分:3)

不幸的是,state_clickable没有StateListDrawable属性。您可以通过两种方式解决问题:

  1. 调用setClickable()时更改视图的背景。
  2. 介绍您自己的state_clickable选择器状态。
  3. 如果您更喜欢第二种方式,则需要将以下更改添加到项目中:

    <强> 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中的代码添加到它们中。