`DataBindingUtil` 中的 `bind`、`inflate` 和 `setContentView` 有啥区别

Posted

技术标签:

【中文标题】`DataBindingUtil` 中的 `bind`、`inflate` 和 `setContentView` 有啥区别【英文标题】:What is the difference between `bind`, `inflate` and `setContentView` in `DataBindingUtil``DataBindingUtil` 中的 `bind`、`inflate` 和 `setContentView` 有什么区别 【发布时间】:2020-10-13 10:01:39 【问题描述】:

我已经看到DataBindingUtil 与所有三种方法一起使用,但从文档 (https://developer.android.com/reference/android/databinding/DataBindingUtil) 中并不清楚这三种方法有什么区别。

【问题讨论】:

【参考方案1】:

bind 采用已经膨胀的视图层次结构并为其返回 ViewDataBinding

inflate 获取布局资源 ID,从中扩展视图层次结构,并为其返回 ViewDataBinding。它本质上等于

val layoutInflater = LayoutInflater.from(context)
val view = layoutInflater.inflate(R.layout.some_layout, ...)
val binding = DataBindingUtil.bind<SomeLayoutBinding>(view)

setContentView 获取布局资源 ID,从中扩展视图层次结构,将其设置为活动内容,并为扩展的视图层次结构返回 ViewDataBinding。它本质上等于

setContentView(R.layout.some_layout)
val view = findViewById<View>(android.R.id.content)
val binding = DataBindingUtil.bind<SomeLayoutBinding>(view)

【讨论】:

这是否需要在 bind 之前调用 inflate 或者我们可以跳过它? LayoutInflater.inflate + SomeLayoutBinding.bind = SomeLayoutBinding.inflate。这取决于您的意思是inflate 我的意思是跳过SomeLayoutBinding.inflate并致电SomeLayoutBinding.bind 视图绑定是视图层次结构的类型安全访问器。 Inflate 从 XML 布局创建视图层次结构。没有视图层次结构的视图绑定没有意义。试试你的建议,看看你自己会发生什么。【参考方案2】:

一般setContentView()会显示在activity中。

但是片段有一个名为 onCreateView 的生命周期方法,它返回一个视图。最常见的方法是在 XML 中扩展视图并返回它(正如您在片段的 java 代码中看到的那样)。在这种情况下,您需要自己充气。片段没有 setContentView 方法。所以 inflate 用于 fragments

绑定只是将视图绑定到布局。

【讨论】:

以上是关于`DataBindingUtil` 中的 `bind`、`inflate` 和 `setContentView` 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

来自包含的 DataBindingUtil 绑定布局

Android 使用DataBindingUtil 封装支持DataBinding的BaseActivityBaseFragment

Android 使用DataBindingUtil 封装支持DataBinding的BaseActivityBaseFragment

Android 使用DataBindingUtil 封装支持DataBinding的BaseActivityBaseFragment

Kotlin TypeCasting

启动器活动中的自定义对话框覆盖活动布局