空 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。
因此,对于具有不同配置和不同视图层次结构的同名布局文件,生成的内部绑定对象可以具有空值,因此数据绑定可能具有可空绑定字段。
在研究 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。
因此,对于具有不同配置和不同视图层次结构的同名布局文件,生成的内部绑定对象可以具有空值,因此数据绑定可能具有可空绑定字段。