在研究android数据绑定时,我的同事告诉我,在少数情况下,android数据绑定可以为null,当一个布局包含另一个带有数据绑定的布局时,生成的数据绑定文件会注释另一个布局布局为@Nullable。我的问题是数据绑定是否为空,如果是,那么?
答案 0 :(得分:1)
数据绑定是一个蓝图。 看到“布局”标记时在编译时创建的类。 蓝图类将命名为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类中。这些值不会为null,因为它们是在编译时自动生成的,因此当您重新建立父级时,子级将存在。
因此,如果您引用的是自动生成的类,并且要在onCreate方法中适当地对其进行更新,则数据绑定不会为空。
现在,如果不传递要绑定的变量,则由于空对象而导致的绑定事件失败会发生,但这不是您要问的问题。
希望有帮助,如果您的意思有所不同,请离题。
答案 1 :(得分:0)
经过这么多年,终于找到了对此的解释。如果您手动执行 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。
因此,对于不同配置和不同视图层次结构的同名布局文件,生成的内部绑定对象可能具有空值,因此数据绑定可能具有可空绑定字段。