以编程方式更改按钮的颜色

时间:2015-06-29 09:41:45

标签: android button

首先,我在SO上阅读了有关此主题的多个主题。方法如PorterDuff colorfilter和更改setBackgroundResource。它们都有效,但是完全随机发生了奇怪的打嗝。

我有一个按钮具有以下样式(未按下状态=白色,按下=灰色):

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true">
        <layer-list>
            <item>
                <shape>
                    <solid android:color="#ffafafaf" />
                    <corners android:radius="30dip"/>
                </shape>
            </item>
        </layer-list>
    </item>
    <item>
        <layer-list>
            <!-- SHADOW LAYER -->
            <item>
                <shape>
                    <solid android:color="#66000000" />
                    <corners android:radius="30dp"/>
                </shape>
            </item>
            <!-- CONTENT LAYER -->
            <item android:left="1dp" android:top="1dp" android:bottom="2dp" android:right="2dp">
                <shape>
                    <solid android:color="#ffffff" />
                    <corners android:radius="30dp"/>
                </shape>
            </item>
        </layer-list>
    </item>
</selector

&GT;

所以为了点击这个按钮绿色而不是白色,我尝试了两种不同的方法。第一个

button.getBackground().setColorFilter(Color.GREEN, PorterDuff.Mode.SRC_ATOP);

比让它恢复正常(白色)我做:

        Drawable d = button.getBackground();
        button.invalidateDrawable(d);
        d.clearColorFilter();

这使按钮恢复正常(白色),但是当我按下它时不是灰色(就像在setColorFilter之前那样)而是绿色。不知何故,colorfilter被转移到按钮按下状态。

第二种方法。除了项目颜色为绿色(而不是白色)外,我创建了一个与我的正常相同的可绘制按钮样式 因此,通过这种方法,我可以像这样更改按钮颜色:

b6.setBackgroundResource(R.drawable.green_button);

我将其改回正常状态:

b6.setBackgroundResource(R.drawable.normal_button);

这可以正常工作,除了当我尝试将按钮重置为正常时发生的奇怪行为1/10。按钮变为灰色,似乎没有读取setBackgroundResource。这种情况都是随机发生的,而logcat中没有任何东西可以辱骂

请有人帮我弄清楚造成这种情况的原因或提出你这样做的方法。我宁愿不使用带有相对布局重叠按钮的文本字段的图像按钮,而不是通过更改图像按钮rsc来改变颜色。但是,还有另一种方式吗?

1 个答案:

答案 0 :(得分:0)

使按钮无效以强制刷新。

b6.invalidate();

这样每次都应该重绘你的按钮。