按自定义非布尔属性布局选择器.有可能吗



我发现了很多关于如何为自定义布尔属性制作选择器的帖子(例如如何添加自定义按钮状态(。但我找不到如何为枚举或int创建选择器。有可能吗?

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

<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框架不能用enums或int为条件构建有效的属性集?

我为enums发明了一种变通方法——根据真实的"state"属性值,声明像status_online、status_away、status_ooffline这样的假布尔属性,并以编程方式将它们置于视图状态。但它看起来很难看,不能解决不确定int的问题(int的确定集也可以用假布尔属性代替(

解决方法的实现:

<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>

最新更新