【问题标题】:Layout selector by custom non boolean attributes. Is it possible?自定义非布尔属性的布局选择器。可能吗?
【发布时间】:2018-12-29 01:00:30
【问题描述】:

我发现了很多关于如何为自定义布尔属性制作选择器的帖子(例如How to add a custom button state)。但我找不到如何为枚举或整数制作选择器。有可能吗?

例如,我有自定义枚举属性

<declare-styleable name="status_indicator">
    <attr name="status" format="enum">
        <enum name="value_offline" value="0"/>
        <enum name="value_away" value="1"/>
        <enum name="value_online" value="2"/>
    </attr>
</declare-styleable>

我想用一个像这样的选择器的背景

<selector xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:app="http://schemas.android.com/apk/res-auto">
    <item android:drawable="@drawable/status_offline" app:status="value_offline"/>
    <item android:drawable="@drawable/status_away" app:status="value_away"/>
    <item android:drawable="@drawable/status_online" app:status="value_online"/>
    <item>
        <shape android:shape="oval">
            <solid android:color="#ff00ff"/>
        </shape>
    </item>
</selector>

这段代码可以编译,但选择器总是应用第一项,就像它没有条件一样。我已经阅读了资料,发现项目匹配是通过比较属性集进行的。我假设android框架无法使用枚举或整数为条件构建有效的属性集?

【问题讨论】:

    标签: android view android-custom-view


    【解决方案1】:

    我为枚举发明了一种解决方法——声明虚假的布尔属性,如 status_online、status_away、status_offline,并以编程方式将它们置于视图状态中,具体取决于真实的“状态”属性值。但是它看起来很丑,不能解决不定整数的问题(确定的整数集也可以用假布尔属性代替)

    变通方法的实现:

    <declare-styleable name="status_indicator">
        <attr name="status_offline" format="boolean"/>
        <attr name="status_away" format="boolean"/>
        <attr name="status_online" format="boolean"/>
        <attr name="status" format="enum">
            <enum name="value_offline" value="0"/>
            <enum name="value_away" value="1"/>
            <enum name="value_online" value="2"/>
        </attr>
    </declare-styleable>
    

    @Override
    public int[] onCreateDrawableState(int extraSpace) {
        final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
        switch (status) {
            case STATUS_ONLINE:
                mergeDrawableStates(drawableState, STATE_STATUS_ONLINE);
                break;
            case STATUS_AWAY:
                mergeDrawableStates(drawableState, STATE_STATUS_AWAY);
                break;
            case STATUS_OFFLINE:
                mergeDrawableStates(drawableState, STATE_STATUS_OFFLINE);
                break;
            default:
                break;
        }
    
        return drawableState;
    }
    

    那么选择器布局应该看起来很像

    <selector xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:app="http://schemas.android.com/apk/res-auto">
        <item android:drawable="@drawable/status_offline" app:status_offline="true"/>
        <item android:drawable="@drawable/status_away" app:status_away="true"/>
        <item android:drawable="@drawable/status_online" app:status_online="true"/>
        <item>
            <shape android:shape="oval">
                <solid android:color="#ff00ff"/>
            </shape>
        </item>
    </selector>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-21
      • 2013-11-07
      • 1970-01-01
      • 1970-01-01
      • 2011-04-27
      • 1970-01-01
      • 2013-06-22
      • 2022-01-23
      相关资源
      最近更新 更多