空 Android 数据绑定

Null Android data-binding

在研究 android 数据绑定时,我的同事告诉我 android 数据绑定在少数情况下可以为空,而且当一个布局包含另一个具有数据绑定的布局时,生成的数据绑定文件将另一个布局的绑定注释为@Nullable。我的问题是数据绑定可以为空吗?如果可以,什么时候可以?

数据绑定是一个蓝图。 在编译时看到 "layout" 标记时创建的 class。 蓝图 class 将被命名为 LayoutNameBinding Pascal Case。

就像任何其他 class 一样,它不存在,直到您为它保留内存并更新它。

因此,当您在 onCreate 上使用数据绑定实用程序时,它会创建 class 并且您可以将其存储在局部变量中供以后使用。

示例:

   override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = DataBindingUtil.setContentView(this, R.layout.activity_main)

    binding.activity = this
    binding.iBindingRecyclerView = this
    binding.navHeader?.activity = this

    setupNavigationDrawer()
}

"layout root xml files that have other layout root xml files nested in them or named include layouts" 将作为 classes 添加到父 NameOfLayoutBinding class 中。这些不会为空,因为它们是在编译时自动生成的,因此当您新建父级时,子级将存在。

因此,如果您指的是自动生成的数据绑定 class 并且如果您在 onCreate 方法中适当地更新它。

现在,如果您没有传入要绑定到的变量,则可能会发生由于空对象导致的绑定失败事件​​,但这不是您问的问题。

希望对您有所帮助,如果您的意思不同,请离题。

这么多年终于找到了解释。如果您手动执行 DataBinding.inflate 函数,则返回的 DataBinding 不会为空。

对于自动生成的绑定(即,当您包含布局并生成绑定并将其分配给父布局绑定中的变量时),根据某些情况,数据绑定可以为空。

例如:假设我们的布局如下:

纵向模式布局:/src/res/layout/activity.xml

<LinearLayout ...>
    <include
      android:id="@+id/main_content"
      layout="@layout/main_content_layout"
    />

</LinearLayout>

对于横向模式:/src/res/layout-land/activity.xml

<LinearLayout ...>
    <include
      android:id="@+id/sidebar"
      layout="@layout/sidebar_layout"
    />

    <include
      android:id="@+id/main_content"
      layout="@layout/main_content_layout"
    />

</LinearLayout>

现在,由于多个布局文件的目的相同但配置不同(横向模式和纵向模式),Android DataBinding 将生成 ActivityBinding.java 文件。现在,开发人员需要使用 ActivityBinding.java class 的对象访问边栏和主要内容的绑定。由于纵向模式布局文件中不存在侧边栏,因此绑定文件将没有任何参考。因此,侧边栏绑定的引用将保留为 Nullable。

因此,对于具有不同配置和不同视图层次结构的同名布局文件,生成的内部绑定对象可以具有空值,因此数据绑定可能具有可空绑定字段。