【问题标题】: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) 中并不清楚这三种方法有什么区别。

【问题讨论】:

    标签: android kotlin android-databinding android-jetpack


    【解决方案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。

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

    【讨论】:

      猜你喜欢
      • 2013-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-20
      • 2015-03-09
      • 2010-09-20
      • 1970-01-01
      相关资源
      最近更新 更多