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

前言自定义 View 的时候如果用到非系统定义的属性的时候,如果要实现双向绑定,不是用了 @= 就行的,自定义 View 中还需要一些设置。下面通过一个例子来说明自定义 View 的双向绑定的实现。例子要求: 1. 通过 RadioButton 来选择爱好(爱好的选项是:吃饭 / 睡觉 / 打豆豆) 2. 画面加载的时候显示初始的爱好值(将 ViewModel 里设好的值传到 RadioButt
摘要由CSDN通过智能技术生成

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 = (
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要使用双向绑定,需要在项目中引入Data Binding库。在项目的build.gradle文件中添加以下依赖项: ``` android { ... dataBinding { enabled = true } } dependencies { ... implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' } ``` 接下来,我们需要创建ViewModel类。在ViewModel中定义我们需要绑定的变量,并提供getter和setter方法。例如: ``` class MyViewModel : ViewModel() { var name = MutableLiveData<String>() fun setName(newName: String) { name.value = newName } fun getName(): String? { return name.value } } ``` 接下来,我们需要在布局文件中设置双向绑定。例如: ``` <layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <import type="android.view.View"/> <variable name="viewModel" type="com.example.MyViewModel"/> </data> <EditText android:id="@+id/editText" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@={viewModel.name}" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Set Name" android:onClick="@{() -> viewModel.setName(editText.text.toString())}" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{viewModel.name}" /> </layout> ``` 在这个布局文件中,我们使用了双向绑定来绑定EditText和TextView中的文本。我们还定义了一个Button来设置ViewModel中的变量。在Button的onClick属性中,我们调用了ViewModel中的setName()方法来设置变量的值。 最后,我们需要在Activity中创建ViewModel实例,并将其绑定到布局文件中。例如: ``` class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val binding: ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main) val viewModel = ViewModelProvider(this).get(MyViewModel::class.java) binding.viewModel = viewModel binding.lifecycleOwner = this } } ``` 在这个例子中,我们使用了DataBindingUtil类来绑定布局文件。我们还创建了一个ViewModel实例,并将其绑定到布局文件中。最后,我们设置了lifecycleOwner,以确保数据绑定可以正确地处理生命周期事件。 这样,我们就完成了使用dataBindingViewModel进行双向绑定的过程。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值