问题
Q1:有没有人设法让自定义字符串/枚举属性在 xml 选择器中工作?我通过遵循 [1] 得到了一个布尔属性,但不是字符串属性。
编辑:感谢您的回答。目前 android 仅支持布尔选择器。有关原因,请参阅已接受的答案。
我打算实现一个有点复杂的自定义按钮,其外观取决于两个变量。其他将是一个布尔属性(真或假)和另一个类属性(具有许多不同的可能值)。我的计划是使用布尔和字符串(或者可能是枚举?)属性。我希望我可以使用布尔和字符串属性在 xml 选择器中定义 UI。
Q2:为什么在 [1] onCreateDrawableState() 中,布尔属性只有在它们为真时才会合并?
这是我测试的,布尔属性有效,字符串无效
注意:这只是一个测试应用程序,用于确定 xml 选择器中是否可以使用字符串/枚举属性。我知道我可以在没有自定义属性的情况下设置按钮的 textcolor。
在我的演示应用程序中,我使用布尔属性将按钮背景设置为暗/亮,并使用字符串属性设置文本颜色,{“red”、“green”、“blue”} 之一。属性定义在/res/values/attrs.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="MyCustomButton">
<attr name="make_dark_background" format="boolean" />
<attr name="str_attr" format="string" />
</declare-styleable>
</resources>
以下是我想要实现的选择器:
@drawable/custom_button_background(有效)
<?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res/com.example.customstringattribute">
<item app:make_dark_background="true" android:drawable="@color/dark" />
<item android:drawable="@color/bright" />
</selector>
@color/custom_button_text_color(不起作用)
<selector
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res/com.example.customstringattribute">
<item app:str_attr="red" android:color="@color/red" />
<item app:str_attr="green" android:color="@color/green" />
<item app:str_attr="blue" android:color="@color/blue" />
<item android:color="@color/grey" />
</selector>
这是自定义按钮背景如何连接到布尔选择器,文本颜色如何连接到字符串选择器。
<com.example.customstringattribute.MyCustomButton
...
android:background="@drawable/custom_button_background"
android:textColor="@color/custom_button_text_color"
...
/>
以下是在 init() 方法中加载属性的方式:
private void init(AttributeSet attrs) {
TypedArray a = getContext().obtainStyledAttributes(attrs,
R.styleable.MyCustomButton);
final int N = a.getIndexCount();
for (int i = 0; i < N; ++i)
{
int attr = a.getIndex(i);
switch (attr)
{
case R.styleable.MyCustomButton_str_attr:
mStrAttr = a.getString(attr);
break;
case R.styleable.MyCustomButton_make_dark_background:
mMakeDarkBg = a.getBoolean(attr, false);
break;
}
}
a.recycle();
}
我有属性的 int[] 数组
private static final int[] MAKE_DARK_BG_SET = { R.attr.make_dark_background };
private static final int[] STR_ATTR_ID = { R.attr.str_attr };
并且那些 int[] 数组被合并到可绘制状态
@Override
protected int[] onCreateDrawableState(int extraSpace) {
Log.i(TAG, "onCreateDrawableState()");
final int[] drawableState = super.onCreateDrawableState(extraSpace + 2);
if(mMakeDarkBg){
mergeDrawableStates(drawableState, MAKE_DARK_BG_SET);
}
mergeDrawableStates(drawableState, STR_ATTR_ID);
return drawableState;
}
我的属性设置器方法中也有 refreshDrawableState() :
public void setMakeDarkBg(boolean makeDarkBg) {
if(mMakeDarkBg != makeDarkBg){
mMakeDarkBg = makeDarkBg;
refreshDrawableState();
}
}
public void setStrAttr(String str) {
if(mStrAttr != str){
mStrAttr = str;
refreshDrawableState();
}
}
[1] :如何添加自定义按钮状态