Android DataBinding (五) 自定义 View 的双向绑定

本文详细介绍了如何在Android DataBinding中实现自定义View的双向绑定,通过自定义RadioButton和RadioGroup,支持从ViewModel中设置初始值,并在用户选择时更新ViewModel。示例包括设置属性、事件监听和源码分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android DataBinding (一) 基本用法
Android DataBinding (二) 事件处理
Android DataBinding (三) Observable
Android DataBinding (四) 自定义属性
Android DataBinding (五) 自定义 View 的双向绑定 (本文)
Android DataBinding (六) EditText 绑定 TextChangedListener 和 FocusChangeListener

前言

自定义 View 的时候如果用到非系统定义的属性的时候,如果要实现双向绑定,不是用了 @= 就行的,自定义 View 中还需要一些设置。

下面通过一个例子来说明自定义 View 的双向绑定的实现。

例子要求:

  1. 通过 RadioButton 来选择爱好(爱好的选项是:吃饭 / 睡觉 / 打豆豆)
  2. 画面加载的时候显示初始的爱好值(将 ViewModel 里设好的值传到 RadioButton 上)
  3. RadioButton 选择的时候把值传到 ViewModel 中去
  4. 可以将 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 =
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值