【Android Jetpack高手日志】DataBinding 从入门到精通

本文详细介绍了Android DataBinding的使用,包括数据的双向绑定、结合LiveData的使用以及自定义特性的双向数据绑定。同时,文章还分析了DataBinding的源码,探讨了初始化流程和调用流程,揭示了DataBinding如何简化Android开发。
摘要由CSDN通过智能技术生成

}

@Bindable //需要变更的变量还要加上 @Bindable 注解

public String getAge() {

return age;

}

@Bindable //需要变更的变量还要加上 @Bindable 注解

public String getName() {

return name;

}

}

TestInfo需要继承BaseObservable,同时对于需要监听变化的变量加上@Bindable 注解,同时该变量的set方法还要加上notifyPropertyChangedBR.xxx 是注解生成的。

数据的双向绑定

使用单向数据绑定时,您可以为特性设置值,并设置对该特性的变化作出反应的监听器:

<CheckBox

android:id="@+id/rememberMeCheckBox"

android:checked="@{viewmodel.rememberMe}"

android:onCheckedChanged="@{viewmodel.rememberMeChanged}"

/>

双向数据绑定为此过程提供了一种快捷方式:

<CheckBox

android:id="@+id/rememberMeCheckBox"

android:checked="@={viewmodel.rememberMe}"

/>

@={} 表示法(其中重要的是包含“=”符号)可接收属性的数据更改并同时监听用户更新。其他的设置和前面的单向数据绑定一致。

结合 LiveData 使用

内容参考自这里,我们上面在使用 DataBinding 时,TestInfo 还要继承 BaseObserble,使用注解、notifyPropertyChanged(),使用起来其实挺复杂,而且还有侵入性。LiveData 结合 DataBinding 的使用步骤如下:

  1. 使用 LiveData 对象作为数据绑定来源,需要设置 LifecycleOwner。

  2. xml 中定义变量 ViewModel,并使用 ViewModel。

  3. binding 设置变量 ViewModel。

//结合DataBinding使用的ViewModel

//1. 要使用LiveData对象作为数据绑定来源,需要设置LifecycleOwner

binding.setLifecycleOwner(this);

ViewModelProvider viewModelProvider = new ViewModelProvider(this);

mUserViewModel = viewModelProvider.get(UserViewModel.class);

//3. 设置变量ViewModel

binding.setVm(mUserViewModel);

xml 文件的定义如下:

<variable

name=“vm”

type=“com.hfy.demo01.module.jetpack.databinding.UserViewModel” />

<TextView

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:text="@{vm.userLiveData.name}"/>

<TextView

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:text="@{vm.userLiveData.level}"/>

这样就ok了,你会发现 我们不需要在 Activity 中拿到 LivaData 去 observe(owner,observer)了,DataBinding 自动生成的代码,会帮我们去做这操作,所以需要设置LifecycleOwner。

使用自定义特性的双向数据绑定

例如,如果要在名为 MyView 的自定义视图中对 "time" 特性启用双向数据绑定,请完成以下步骤:

  1. 使用 @BindingAdapter,对用来设置初始值并在值更改时进行更新的方法进行注释:

@BindingAdapter(“time”)

@JvmStatic fun setTime(view: MyView, newValue: Time) {

// Important to break potential infinite loops.

if (view.time != newValue) {

view.time = newValue

}

}

  1. 使用 @In
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值