- 单选组
RadioGroup
- 单选按钮
RadioButton
原生抽象的局限性在于:RadioGroup
和RadioButton
是父子关系,即RadioGroup必须是一个明确的ViewGroup
类型,这样就约束了RadioButton的布局方式。
如果单选组不是一个View
,是不是就可以解放这层约束?
对于这个问题的答案留一个悬念,抛开单选组,先来看看单选按钮是一个怎么样的抽象。
单选按钮应该包含如下基本特性:
- 是一个View,且可点击
- 有两种状态(选中、未选中),且对应不同的视图
只需要继承View,并利用View.isSelected()
就能实现这两个特性。代码如下:
public abstract class Selector extends FrameLayout implements View.OnClickListener {
public Selector(Context context) {
super(context);
initView(context, null);
}
public Selector(Context context, AttributeSet attrs) {
super(context, attrs);
initView(context, attrs);
}
public Selector(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView(context, attrs);
}
private void initView(Context context, AttributeSet attrs) {
//实现特性1:可点击
this.setOnClickListener(this);
}
@Override
public void onClick(View v) {
//实现特性2:点击后改变选中状态
boolean isSelect = switchSelector();
}
//反转选中状态
public boolean switchSelector() {
boolean isSelect = this.isSelecte