android selector中使用state_checked

项目中很多需求需要根据view不同状态现实不同的前景或背景颜色,一般都使用selector的XML将业务和UI效果隔离。
但是如果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和普通的一样



    
    






layout XML使用也和标准用法没有区别
   	




JAVA代码中只需要简单setChecked调用就实现了。

你可能感兴趣的:(android selector中使用state_checked)