我正在尝试在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>
有没有办法实现这个目标?
答案 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>