@ (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 :"를 사용했을 것입니다. XML 네임 스페이스는 팽창기의 올바른 해석에 중요하며 속성을 추가하는 프로젝트 유형에 따라 다릅니다. 응용 프로그램 인 경우 com.mydomain.mypackage 를 응용 프로그램 의 실제 패키지 이름 (응용 프로그램 이름 제외)으로 바꾸십시오. 라이브러리 인 경우 "http://schemas.android.com/apk/res-auto"(및 도구 R17 이상 사용)를 사용해야합니다. 그렇지 않으면 런타임 오류가 발생합니다.
몇 가지 메모 :
"refreshDrawableState"함수를 호출 할 필요가없는 것 같습니다. 적어도 제 경우에는 솔루션이 제대로 작동합니다.
레이아웃 xml 파일에서 사용자 정의 클래스를 사용하려면 정규화 된 이름 (예 : com.mydomain.mypackage.FoodButton)을 지정해야합니다.
더 복잡한 상태 조합을 나타 내기 위해 사용자 정의 상태와 혼합 표준 상태 (예 : android : pressed, android : enabled, android : selected)를 만들 수 있습니다.