Jetpack系列之DataBinding数据双向绑定
创始人
2025-06-01 07:18:03
0

(一)概述

DataBinding是Jetpack中实现数据双向绑定的组件。

android {...// 开启 dataBindingdataBinding {enabled = true}
}

(二)DataBinding 注解

1)@Bindable
说明:该注解用于双向绑定,需要与 notifyPropertyChanged()方法结合使用
该注解用于标记实体类的方法, 且实体类必须继承BaseObserable.
@Bindable
var hasFavorite: Boolean = falseset(value) {field = valuenotifyPropertyChanged(BR._all)}2) @BindingAdapter
/*** 加载网络图片** 自定义属性:使用@BindingAdapter* 方法必须为公共静态方法,可以有一到多个参数。* requireAll = false:可以使用这两个属性中的任一个或同时使用.* 注意:方法的第一个参数必须是 自定义 XXImageView 本身*/
@BindingAdapter(value = ["image_url", "isCircle", "radius"], requireAll = false)
fun setImageUrl(view: XXImageView, imgUrl: String, isCircle: Boolean = false, radius: Int = 0) {val builder = Glide.with(view).load(imgUrl)if (isCircle) {builder.transform(CircleCrop())} else if (radius > 0) {builder.transform(RoundedCornersTransformation(PixUtils.dp2px(radius), 0))}val layoutParams = view.layoutParamslayoutParams?.let {// 设置图片尺寸if (it.width > 0 && it.height > 0) {builder.override(it.width, it.height)}}builder.into(view)
}
---例如---


xx.xx(param1, param2…)}"tools:src="@mipmap/ic_launcher_round" />

 布局内变量引用 layout_xxx.xml:





val inflater: LayoutInflater = LayoutInflater.from(context)
val binding = LayoutFeedTypeVideoBinding.inflate(inflater)
说明:通过这个binding 对象就可以拿到所有layout_feed_type_video.xml组件对象和变量。注意:当导入多个类型时,类型可能会冲突。当类名有冲突时,可以使用别名重命名

另外:
1) 只需导入Context:

就可以使用访问数据绑定的上下文对象context(无需定义变量)
android:onClick="@{()->InteractionPresenter.INSTANCE.openShare(context, feed)}"2) 可以给 databinding 布局的 xml 变量(如:user)直接赋值:
binding = FragmentMyBinding.inflate(inflater, container, false)
binding.setVariable(BR.user, UserManager.mUser)

资源引用 xxx.xml

%s---%s  

android:text="@{@string/nameFormat(vm.firstName, vm.lastName)}"
android:padding="@{vm.large? @dimen/largePadding : @dimen/smallPadding}"

注意:编写databinding xml布局时,如果编译器不提示详细的错误信息,可以使用命令gradlew compileDebugSource --stacktrace -info或者点击Android Studio右侧Gradle-app->other->assembleDebug来查看具体的错误。

(三)ViewBinding与DataBinding区别

1)ViewBinding

ViewBinding会根据xml布局文件自动生成对应的XXXBinding类,然后通过XXXBinding.inflate(layoutInflater)生成一个对应的binding对象, 这个binding对象包含了这个xml布局文件中具有 ID 的所有视图对象,可以直接引用,省去了findViewById的操作。 binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root)

2)DataBinding

DataBinding是一个数据绑定库,它将xml布局中的界面组件绑定到代码中的数据对象, 可以通过对实体字段添@Bindable注解结合notifyPropertyChanged()实现双向绑定,也可以通过对自定义view添加带@BindingAdapter注解的方法来实现自定义属性。 将xml改成databinding 布局后,这样就可以直接绑定并注入xml了: binding = DataBindingUtil.setContentView(this, R.layout.activity_xxx)

通过导包了解,ViewBinding自动生成的XXXBinding也属于DataBinding,也就是DataBinding包含了ViewBinding。

相关内容

热门资讯

韩束卷入违规添加风波,上美股份... 出品|达摩财经护肤品品牌韩束陷入“违规添加”风波,母公司上美股份股价大跌。12月29日,上美股份(2...
2026会好起来吗? 文/浪淘沙雕(识局微信公共账号zhijuzk)这问题真有意思。什么叫“会好起来吗”,难道之前坏过?不...
收官倒计时!A股跨年行情蓄势,... 12月29日,A股缩量微跌,逾3000只个股收绿,但成交额仍在2.1万亿元上方。有色金属、电力设备等...
“12连板”大牛股停牌核查 12月29日,胜通能源公告称,公司股票自2025年12月12日至29日期间价格涨幅为213.97%,...
寿司郎怎么这么狂? 订阅 快刀财经 ▲ 做您的私人商学院多靠同行衬托。作者:半佛仙人来源:半佛仙人(ID:banfoSB...
上任仅两个月,众泰汽车62岁董... 红星资本局12月29日消息,今日晚间,众泰汽车(000980.SZ)公告称,公司董事长李立忠因个人家...
今年股价大涨近1900%,大牛... 12月29日晚,上纬新材公告称,公司股票自2025年7月9日至12月29日累计上涨1598.33%,...
痛别!吴锋院士逝世 ◎ 科技日报记者 张盖伦 12月29日,记者从北京理工大学了解到,中国工程院院士、著名材料科学家、我...
金价新高也不慌?资管机构认可黄... 全文共3234字,阅读全文约需7分钟随着金价的不断走高,黄金在资产配置中的角色日益被国内资管机构所关...