@(Ted Hopp)指示的解决方案有效,但需要稍微更正:在选择器中,项目状态需要一个“app:”前缀,否则inflater将无法正确识别名称空间,并且会默默失败;至少这是发生在我身上的事情。
请允许我在这里报告的整体解决方案,与一些更多的细节:
首先,创建文件 “RES /价值/ 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>
然后定义您的自定义类。例如,它可能是一个“FoodButton”类,从类“Button”派生。你将不得不实现一个构造函数;实现这一个,这似乎是由充气使用的一个:
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 /绘制/ 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>
公告的 “应用程序:” 前缀,而使用标准Android状态就要使用前缀 “机器人”。 XML名称空间对于inflater的正确解释至关重要,并取决于您添加属性的项目类型。如果是应用程序,请将com.mydomain.mypackage替换为应用程序的实际软件包名称(不包括应用程序名称)。如果它是一个库,则必须使用“http://schemas.android.com/apk/res-auto”(并且使用Tools R17或更高版本),否则您将收到运行时错误。
有两点要注意:
看来你并不需要调用“refreshDrawableState”功能,至少解决方案的工作以及是,在我的情况
为了要在布局xml文件中使用您的自定义类,您必须指定完全限定的名称(例如com。mydomain.mypackage.FoodButton)
您可以根据WEEL混淆标准状态(例如机器人:按下时,机器人:启用,机器人:选择)自定义状态,以表示更复杂的状态组合
我想为EditText视图添加额外的状态以确定两个密码框匹配时是否显示一个复选标记。 – schwiz 2010-12-23 22:07:53