繁体   English   中英

空 Android 数据绑定

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM