[英]Null Android data-binding
在研究android数据绑定时,我的同事告诉我,android数据绑定在少数情况下可以为空,而且当一个布局包含另一个具有数据绑定的布局时,生成的数据绑定文件将另一个布局的绑定注释为@可以为空。 我的问题是数据绑定可以为空吗?如果是,什么时候?
数据绑定是一个蓝图。 在编译时看到“layout”标签时创建的类。 蓝图类将命名为 LayoutNameBinding Pascal Case。
就像任何其他类一样,它是不存在的,除非您为它保留内存并对其进行更新。
因此,当您在 onCreate 上使用数据绑定实用程序时,它会创建该类,您可以将其存储在局部变量中以供以后使用。
例子:
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()
}
“具有嵌套在其中的其他布局根 xml 文件或命名为包含布局的布局根 xml 文件”将作为类添加到父 NameOfLayoutBinding 类中。 这些不会为空,因为它们是在编译时自动生成的,因此当您新建父级时,子级将存在。
因此,如果您指的是自动生成的类,并且如果您在 onCreate 方法中适当地更新它,则数据绑定不会为空。
现在,如果您没有传入要绑定到的变量,则可能会发生由于空对象导致的绑定失败事件,但这不是您问的问题。
希望有所帮助,如果您的意思不同,请离题。
终于,经过这么多年,找到了对此的解释。 如果您手动执行 DataBinding.inflate 函数,则返回的 DataBinding 不会为空。
对于自动生成的绑定(即,当您包含一个布局并生成绑定并将其分配给父布局绑定中的变量时),根据某些情况,数据绑定可以为空。
例如:假设我们的布局如下:
纵向模式布局:/src/res/layout/activity.xml
<LinearLayout ...>
<include
android:id="@+id/main_content"
layout="@layout/main_content_layout"
/>
</LinearLayout>
对于 Lanscape 模式:/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 类的对象访问侧边栏和主要内容的绑定。 由于侧边栏不存在于纵向模式布局文件中,因此绑定文件将没有任何参考。 因此,侧边栏绑定的引用将保持为 Nullable。
因此,对于不同配置和不同视图层次结构的同名布局文件,生成的内部绑定对象可以具有空值,因此数据绑定可能具有可空绑定字段。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.