当可点击为假时更改按钮的背景颜色

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() 方法,这就是你现在的方式。

以上是关于当可点击为假时更改按钮的背景颜色的主要内容,如果未能解决你的问题,请参考以下文章

在 SwiftUI 中点击更改按钮背景颜色

在swift UI中点击按钮时如何更改背景颜色和图像?

按下时更改操作栏按钮的背景颜色

单选按钮,更改背景颜色 PHP

如何更改MFC按钮的背景色

突出显示时更改 UIButton 的背景颜色