Android DataBinding (一) 基本用法
Android DataBinding (二) 事件处理
Android DataBinding (三) Observable
Android DataBinding (四) 自定义属性
Android DataBinding (五) 自定义 View 的双向绑定 (本文)
Android DataBinding (六) EditText 绑定 TextChangedListener 和 FocusChangeListener
前言
自定义 View 的时候如果用到非系统定义的属性的时候,如果要实现双向绑定,不是用了 @= 就行的,自定义 View 中还需要一些设置。
下面通过一个例子来说明自定义 View 的双向绑定的实现。
例子要求:
- 通过 RadioButton 来选择爱好(爱好的选项是:吃饭 / 睡觉 / 打豆豆)
- 画面加载的时候显示初始的爱好值(将 ViewModel 里设好的值传到 RadioButton 上)
- RadioButton 选择的时候把值传到 ViewModel 中去
- 可以将 RadioButton 的值清空,也就是说可以没有爱好
首先自定义 RadioButton 和 RadioGroup
由于爱好是需要定义成 enum 类型的,而 RadioGroup 选择 RadioButton 的时候是通过 id 来的,所以必须先把 enum 转换成 id 才能够实现绑定。但是我们可以通过自定义 RadioButton 和 RadioGroup 来让他们支持 enum 绑定!
先来看自定义 RadioButton 的代码
public class DataBindingRadioButton extends AppCompatRadioButton {
private Integer value;
public DataBindingRadioButton(Context context) {
super(context);
}
public DataBindingRadioButton(Context context, AttributeSet attrs) {
super(context, attrs);
}
public DataBindingRadioButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public Integer getValue() {
return value;
}
public void setValue(Integer value) {
this.value = value;
}
@Override
public void toggle() {
if (isChecked()) {
if (getParent() instanceof RadioGroup) {
// 点击选中的 RadioButton,可以取消选择
((RadioGroup) getParent()).clearCheck();
}
} else {
setChecked(true);
}
}
@BindingAdapter(value = {
"value"})
public static void setValue(DataBindingRadioButton radioButton, Integer value) {
radioButton.setValue(value);
ViewParent parent = radioButton.getParent();
if (parent instanceof DataBindingRadioGroup) {
Integer checkedValue = (