@(Ted Hopp)指示的解决方案有效,但需要稍作修正:在选择器中,项目状态需要一个“ app:”前缀,否则,充气机将无法正确识别名称空间,并且将无提示地失败;至少这是发生在我身上的事情。
请允许我在这里报告整个解决方案,以及更多详细信息:
首先,创建文件“ res / values / attrs.xml”:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="food">
<attr name="state_fried" format="boolean" />
<attr name="state_baked" format="boolean" />
</declare-styleable>
</resources>
然后定义您的自定义类。例如,它可以是派生自“ Button”类的“ FoodButton”类。您将必须实现一个构造函数。实现这一功能,这似乎是充气机使用的功能:
public FoodButton(Context context, AttributeSet attrs) {
super(context, attrs);
}
在派生类之上:
private static final int[] STATE_FRIED = {R.attr.state_fried};
private static final int[] STATE_BAKED = {R.attr.state_baked};
另外,您的状态变量:
private boolean mIsFried = false;
private boolean mIsBaked = false;
还有几个二传手:
public void setFried(boolean isFried) {mIsFried = isFried;}
public void setBaked(boolean isBaked) {mIsBaked = isBaked;}
然后覆盖函数“ onCreateDrawableState”:
@Override
protected int[] onCreateDrawableState(int extraSpace) {
final int[] drawableState = super.onCreateDrawableState(extraSpace + 2);
if (mIsFried) {
mergeDrawableStates(drawableState, STATE_FRIED);
}
if (mIsBaked) {
mergeDrawableStates(drawableState, STATE_BAKED);
}
return drawableState;
}
最后,这个难题中最微妙的部分;定义StateListDrawable的选择器,它将用作窗口小部件的背景。这是文件“ res / drawable / food_button.xml”:
<?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.mydomain.mypackage">
<item
app:state_baked="true"
app:state_fried="false"
android:drawable="@drawable/item_baked" />
<item
app:state_baked="false"
app:state_fried="true"
android:drawable="@drawable/item_fried" />
<item
app:state_baked="true"
app:state_fried="true"
android:drawable="@drawable/item_overcooked" />
<item
app:state_baked="false"
app:state_fried="false"
android:drawable="@drawable/item_raw" />
</selector>
注意“ app:”前缀,而对于标准的android状态,您应该使用前缀“ android:”。XML名称空间对于充气机的正确解释至关重要,并且取决于要在其中添加属性的项目的类型。如果是应用程序,请将com.mydomain.mypackage替换为应用程序的实际包名称(不包括应用程序名称)。如果是库,则必须使用“ http://schemas.android.com/apk/res-auto”(并使用Tools R17或更高版本),否则会出现运行时错误。
一些注意事项:
看来您不需要调用“ refreshDrawableState”函数,至少在我的情况下,该解决方案可以正常工作
为了在布局xml文件中使用自定义类,您将必须指定完全限定的名称(例如com.mydomain.mypackage.FoodButton)
您可以将weel混淆的标准状态(例如android:pressed,android:enabled,android:selected)与自定义状态结合起来,以表示更复杂的状态组合