当前位置:   article > 正文

Android DataBinding之布局include 和 viewStub详解与使用(六)_android databinding include

android databinding include

一、介绍

        前面几章节,我们已系统的学习了布局和数据的绑定,都是涉及到布局和数据的更细部分,这个章节我们依旧介绍一个使用频率很多的两个布局include 和viewStub

二、使用介绍

1、include

                布局导入,在我们开发过程中经常遇到,将一个公共组件view抽取成一个布局,然后用的使用include进来。这样方便我们大家协同开发。如果我们通过databind来管理,这样就很官方。只要我们将数据模块给到include的layout,这样我们就可以不用管理布局里面的,只需要单独处理好数据即可。

1.1、根布局

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <layout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:bind="http://schemas.android.com/apk/res-auto">
  4. <data class="MyConstan">
  5. <import type="androidx.databinding.ObservableField" />
  6. <variable
  7. name="name"
  8. type="ObservableField&lt;String&gt;" />
  9. </data>
  10. <LinearLayout
  11. android:layout_width="match_parent"
  12. android:layout_height="match_parent"
  13. android:orientation="vertical">
  14. <Button
  15. android:id="@+id/btn_bind"
  16. android:layout_width="match_parent"
  17. android:layout_height="wrap_content"
  18. android:text="单向绑定"
  19. />
  20. <include
  21. layout="@layout/view_db_include"
  22. bind:name="@{name}" />
  23. </LinearLayout>
  24. </layout>

include子布局:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <layout xmlns:android="http://schemas.android.com/apk/res/android">
  3. <data>
  4. <import type="androidx.databinding.ObservableField" />
  5. <variable
  6. name="name"
  7. type="ObservableField&lt;String&gt;" />
  8. </data>
  9. <LinearLayout
  10. android:layout_width="match_parent"
  11. android:layout_height="wrap_content"
  12. android:orientation="vertical">
  13. <TextView
  14. android:layout_width="wrap_content"
  15. android:layout_height="wrap_content"
  16. android:text="include module" />
  17. <TextView
  18. android:layout_width="wrap_content"
  19. android:layout_height="wrap_content"
  20. android:padding="5dp"
  21. android:text="@{name}" />
  22. </LinearLayout>
  23. </layout>

布局数据交互:

如果在子布局data节点下定义了variable数据类型,那么这个数据就是根布局include的扩展字段

子布局:

 <variable
            name="name"
            type="ObservableField<String>" />

根布局:bind:name="@{name}"

        数据格式要对应。这样数据就可以绑定关联起来,支持数据单向和双向绑定,在绑定数据的时候,只需要设置好根布局的data数据即可。

2、ViewStub

        ViewStub在大型负责的布局业务开发过程中也常常被用到,即用到再加载,这样可以提升设备性能。减少不需要的内存开销

在Data Binding中,同样也支持ViewStub的绑定

根布局:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <layout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:bind="http://schemas.android.com/apk/res-auto">
  4. <data class="MyConstan">
  5. <import type="androidx.databinding.ObservableField" />
  6. <variable
  7. name="name"
  8. type="ObservableField&lt;String&gt;" />
  9. </data>
  10. <LinearLayout
  11. android:layout_width="match_parent"
  12. android:layout_height="match_parent"
  13. android:orientation="vertical">
  14. <Button
  15. android:id="@+id/btn_bind"
  16. android:layout_width="match_parent"
  17. android:layout_height="wrap_content"
  18. android:text="单向绑定"
  19. />
  20. <ViewStub
  21. android:id="@+id/viewsub"
  22. android:layout_width="wrap_content"
  23. android:layout_height="wrap_content"
  24. android:layout="@layout/view_db_viesub"
  25. bind:user="@{name}"
  26. />
  27. </LinearLayout>
  28. </layout>

待加载布局:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <layout xmlns:android="http://schemas.android.com/apk/res/android">
  3. <data class="ViewSubData">
  4. <import type="androidx.databinding.ObservableField" />
  5. <variable
  6. name="user"
  7. type="String" />
  8. <!-- <variable-->
  9. <!-- name="user"-->
  10. <!-- type="ObservableField&lt;String&gt;" />-->
  11. </data>
  12. <LinearLayout
  13. android:layout_width="match_parent"
  14. android:layout_height="wrap_content"
  15. android:orientation="vertical">
  16. <TextView
  17. android:layout_width="wrap_content"
  18. android:layout_height="wrap_content"
  19. android:text="viewSub module" />
  20. <TextView
  21. android:layout_width="wrap_content"
  22. android:layout_height="wrap_content"
  23. android:padding="5dp"
  24. android:text="@{user}" />
  25. </LinearLayout>
  26. </layout>

如何加载布局?

  1. var inflatView: View? = null
  2. if (!bind.viewsub.isInflated) {
  3. inflatView = bind.viewsub.viewStub?.inflate()!!
  4. }

数据绑定:

        viewstub的数据绑定也是分为两个方法:

1.在布局中直接绑定

也是通过扩展字段映射过去,

  1.   <ViewStub
  2.             android:id="@+id/viewsub"
  3.             android:layout_width="wrap_content"
  4.             android:layout_height="wrap_content"
  5.             android:layout="@layout/view_db_viesub"
  6.             bind:user="@{name}"
  7.            />

        这里有个问题,如果的根数据是ObservableField<String>,我们正常是需要在待加载数据也设置成ObservableField<String>,但是,在Impl数据转换的时候,数据被进行了转换,

 

        所以你的在待加载布局中不要单独通过ObservableField接收数据。如果你不会,处理不好,可以通过一个对象来更新。或者用下面第二种方法来处理

2、代码中绑定

我们先把待加载的布局bind出来

var subData = DataBindingUtil.bind<ViewSubData>(inflatView!!)

ViewSubData:是待加载布局data class。

inflatView:viewStub.inflate的 root

注意:待加载布局还是include的布局,都可以设置class名称,不会影响根布局class的设置

数据绑定:

1.setVariable

subData?.setVariable(BR.user, text)

2.直接设置数据

var name = ObservableField<String>()
subData?.user=name

解释:

        如果你通过代码去设置data,是支持ObservableField的类型,但是在xml布局中,就会被处理转换了。切记,如果你想单向绑定,可以通过代码来设置

setVariable介绍:

        setVariable申请的变量也会在BR中生成对标的flag字段。这个字段和Bindable是一样的,所以你也可以通过设置setVariable,指向申明的字段和对应的数据绑定也是可以的。

三、总结

这样我们就完成了include和ViewStub的介绍与使用,但是ViewStub在数据绑定的时候特别要小心,如果你排查不好xml ViewStub数据绑定,就通过代码去控制

加载完待加载的ViewStub,然后通过代码直接赋值。        

子布局和待加载的布局data都是可以有自己的class name。设置后不会影响根布局的data class的设置。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/320667
推荐阅读
相关标签
  

闽ICP备14008679号