首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android:是否可以在可绘制选择器中使用字符串/枚举?

Android:是否可以在可绘制选择器中使用字符串/枚举?
EN

Stack Overflow用户
提问于 2012-10-31 04:48:26
回答 3查看 4.8K关注 0票数 22

问题

Q1:有没有人设法让自定义字符串/枚举属性在xml选择器中工作?我通过跟随1得到了一个布尔型属性,而不是一个字符串属性。

编辑:感谢您的回答。目前android只支持布尔选择器。有关原因,请参阅接受的答案。

我计划实现一个小的复杂的自定义按钮,它的外观取决于两个变量。其他属性是布尔属性(true或false)和另一个类似类别的属性(具有许多不同的可能值)。我的计划是使用boolean和string (或者可能是枚举?)属性。我希望我可以在xml选择器中使用布尔值和字符串属性来定义UI。

Q2:为什么在1中onCreateDrawableState(),布尔属性只有在它们为真时才被合并?

这就是我测试过的,布尔型属性有效,字符串无效

注释:这只是一个测试应用程序,用于确定是否可以在选择器中使用字符串/枚举属性。我知道我可以在没有自定义属性的情况下设置按钮的textcolor。

在我的演示应用程序中,我使用boolean属性将按钮背景设置为暗/亮,使用string属性设置文本颜色,{"red","green","blue"}之一。属性在/res/values/attrs.xml中定义

代码语言:javascript
运行
复制
<?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 (可用)

代码语言:javascript
运行
复制
<?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 (无效)

代码语言:javascript
运行
复制
<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>

下面是如何将自定义按钮背景连接到布尔选择器,以及将文本颜色连接到字符串选择器。

代码语言:javascript
运行
复制
<com.example.customstringattribute.MyCustomButton
    ...
    android:background="@drawable/custom_button_background"
    android:textColor="@color/custom_button_text_color"
    ...
/>

下面是在init()方法中加载属性的方式:

代码语言:javascript
运行
复制
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[]数组

代码语言:javascript
运行
复制
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[]数组合并到可绘制状态

代码语言:javascript
运行
复制
@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():

代码语言:javascript
运行
复制
public void setMakeDarkBg(boolean makeDarkBg) {
    if(mMakeDarkBg != makeDarkBg){
        mMakeDarkBg = makeDarkBg;
        refreshDrawableState();
    }
}

public void setStrAttr(String str) {
    if(mStrAttr != str){
        mStrAttr = str;
        refreshDrawableState();
    }
}

1:How to add a custom button state

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13147360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档