项目中很多需求需要根据view不同状态现实不同的前景或背景颜色,一般都使用selector的XML将业务和UI效果隔离。
但是如果view的UI效果是check性质的(开和关状态UI效果不同),则使用selector的XML描述将不起作用,必须手写控制代码来切换UI效果。
例如:
或者
这样根据view状态显示UI效果的代码就分别存在业务代码 JAVA中和selector XML中,为了统一,集中存在selector XML中。
可以采用如下JAVA自定义代码:
onCreateDrawableState函数将state_checked属性加入到view的状态列表中,这样就可以在selector设置了。
selector XML和普通的一样
layout XML使用也和标准用法没有区别
JAVA代码中只需要简单setChecked调用就实现了。
但是如果view的UI效果是check性质的(开和关状态UI效果不同),则使用selector的XML描述将不起作用,必须手写控制代码来切换UI效果。
例如:
setChecked(true);
setColor(#ffffff);
或者
setChecked(false);
setColor(#a7a7a6);
这样根据view状态显示UI效果的代码就分别存在业务代码 JAVA中和selector XML中,为了统一,集中存在selector XML中。
可以采用如下JAVA自定义代码:
public class CheckableTextView extends TextView implements Checkable {
private boolean mChecked;
private static final int[] CHECKED_STATE_SET = {
android.R.attr.state_checked
};
public CheckableTextView(Context context) {
super(context);
}
public CheckableTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected int[] onCreateDrawableState(int extraSpace) {
final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
if (isChecked()) {
mergeDrawableStates(drawableState, CHECKED_STATE_SET);
}
return drawableState;
}
@Override
public boolean isChecked() {
return mChecked;
}
@Override
public void setChecked(boolean arg0) {
mChecked = arg0;
refreshDrawableState();
}
@Override
public void toggle() {
mChecked = !mChecked;
}
}
onCreateDrawableState函数将state_checked属性加入到view的状态列表中,这样就可以在selector设置了。
selector XML和普通的一样
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="#ffffff" android:state_checked="true"/>
<item android:color="#a7a7a6" android:state_checked="false"/>
</selector>
layout XML使用也和标准用法没有区别
<com.xxx.CheckableTextView android:id="@+id/index"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:textColor="@color/lottery_team_selector"
/>
JAVA代码中只需要简单setChecked调用就实现了。