如何添加具有点按状态的用户可配置按钮?

时间:2017-05-12 21:20:14

标签: java android

我正在尝试在Android中创建一个按钮,该按钮具有边框但在按下时具有不同的背景色调,并且能够更改按钮背景的颜色。我知道adding a border正在为它指定一个形状,并且通过具有不同项目的选择器来点击状态,但问题是按钮背景颜色是用户配置的。

没有tap状态,我可以让用户只需执行以下操作即可更改形状的背景颜色:

GradientDrawable bgShape = (GradientDrawable) btn.getBackground();
        //color value is obtained from shared preferences
        if (sharedPref.contains(pref_color)) {
            String color = sharedPref.getString(pref_color, "");
            bgShape.setColor(Color.parseColor(color));
        }

但如果我的按钮将被分配一个选择器,我就无法完成第一行。我不知道如何获得可绘制形状的参考。

作为参考,我的按钮边框形状为:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">

    <stroke android:width="5px" android:color="#ffffff" />
</shape>

选择器看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

<item android:drawable="@drawable/button_press" android:state_pressed="true"/>
<item android:drawable="@drawable/button_border" />

</selector>

有没有办法实现这个目标?

1 个答案:

答案 0 :(得分:1)

您可以为可绘制图层定义id,然后在运行时更改其属性

LayerDrawable drawSettings = (LayerDrawable)
getResources().getDrawable(R.drawable.sample);
GradientDrawable backSettings = (GradientDrawable)
drawSettings.findDrawableByLayerId(R.id.backtemp);

并在更改颜色后将其重置为按钮背景

view.setBackground(drawable);

这是一个可绘制的sample.xml样本

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/backtemp">
<shape
android:shape="oval" >
<solid android:color="@color/default_color"/>
</shape>
</item>

<item
android:drawable="@drawable/w_pref">
</item>
</layer-list>