当前位置:   article > 正文

MVVM框架使用之xml详解_mvvm layout标签

mvvm layout标签

(字体放大会促进学习兴趣哦)

其他相关文章:

android之LifeCycle:https://blog.csdn.net/li6472/article/details/119795952?spm=1001.2014.3001.5501

android之LiveData:https://blog.csdn.net/li6472/article/details/119784791?spm=1001.2014.3001.5501

android之ViewModel:https://blog.csdn.net/li6472/article/details/119800423?spm=1001.2014.3001.5501

android之MVVM框架使用之BaseObservable与双向绑定MVVM框架使用之BaseObservable与双向绑定:https://blog.csdn.net/li6472/article/details/119782825?spm=1001.2014.3001.5501

android之MVVM理解:https://blog.csdn.net/li6472/article/details/119762190?spm=1001.2014.3001.5501

amdroid之MVVM写一个简单的程序:https://blog.csdn.net/li6472/article/details/119761806?spm=1001.2014.3001.5501

一 DataBinding的标签

(compilerCommon这个jar包中的android/databinding/tool/store/LayoutFileParser.java这个类中找到。)

- layout标签(根标签)
- data标签:class属性
- variable标签:type属性、name属性
- import标签:type属性、alias属性

layout标签

1 layout标签内部只能有一个直接子view,多于1个就会报错,这个和ScrollView的要求是类似的。
2 记得把android和app的命名空间提升到layout标签中
3 layout标签的直接子标签不能是merge,否则报错。
4 fragment标签不支持dataBinding表达式,即在fragment标签中使用任何dataBinding表达式都会报错,即如下使用方式是错误的:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <1ayout
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. xmlns:app="http://schemas.android.com/apk/res-auto">
  5. </layout>

此处layout一定要小写,迷了半个小时

data标签

data标签的作用就是用来承载数据的,在data标签内部可以定义多个import标签和variable标签。

class属性的作用和用法

data标签有个class属性,用于定义生成的Binding类的规则。该属性不是必填属性,如果不填则采用默认的Binding类生成规则,如果要填,则会根据你填写内容的格式不同而有不同的生成规则。
作用

    控制生成的Binding类的名称
    控制生成的Binding类所在的路径

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <layout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto">
  4. <data>
  5. </data>
  6. <LinearLayout
  7. android:layout_width="match_parent"
  8. android:layout_height="match_parent"
  9. android:orientation="vertical">
  10. <TextView
  11. android:layout_width="match_parent"
  12. android:layout_height="50dp"/>
  13. </LinearLayout>
  14. </layout>


在项目包名下先生成databinding文件夹,然后在databinding文件夹中根据布局文件的名称生成Binding类。

根据布局文件的名称生成Binding类的规则为:以大写形式开始,删除下划线(_),并使用驼峰命名,然后后缀为“Binding”。

比如我的项目包名为:com.qiangxi.databindingdemo,布局文件名称为:activity_xml_label,则生成的binding类的名称及结构如下图所示:
默认生成规则

    使用class属性:class=”customClassName”
    生成规则为:
    在项目包名下先生成databinding文件夹,然后在databinding文件夹中生成customClassName类.
    class="customClassName"

    使用class属性:class=”.customClassName”
    生成规则为:
    直接在项目包名下生成customClassName类.而不会再生成databinding文件夹
    class="customClassName"

    使用class属性:class=”cn.rqq.customClassName”
    生成规则为:
    直接创建cn.rqq包名,然后在cn/rqq/文件夹下生成customClassName类
    class="customClassName"

    生成文件所在路径:app Module/build/generated/source/apt/debug文件夹下,根据你自己定义的生成规则去找即可。
variable标签

variable标签就是用来定义“变量”的,这些“变量”就是数据源

variable标签是整个DataBinding机制的核心之一,是联系java代码和xml布局的纽带。variable标签定义在data标签内部,在data标签中,可以定义多个variable标签,每个variable标签的name属性值不可相同,但type属性值可以相同。
type属性(必填):

用于定义数据源所在路径,比如定义User实体类,要定义User的完整类名。具体见下面的示例。
name属性(必填):

用于定义数据源的名称,在遵循基本命名规则的前提下,随意命名,但建议使用有意义的名称。具体见下面的示例。可以用name属性的值引用所属类的字段或方法.

定义String,Integer,Long等包装类型的数据【包括对应的基本类型】,对于包装类型的数据可以不用填写完整类名,因为DataBinding已经自动帮我们导入了java.lang的包了。当然你硬要使用完整类名也可以。

  1. ...
  2. <data>
  3. <variable
  4. name="name"
  5. type="java.lang.String"/>
  6. <variable
  7. name="age"
  8. type="int"/>
  9. <variable
  10. name="sex"
  11. type="String"/>
  12. </data>
  13. ...
  • 定义实体数据,需要导入完整类名
  1. ...
  2. <data>
  3. <variable
  4. name="user"
  5. type="com.qiangxi.databindingdemo.entity.User"/>
  6. </data>

    定义其他类(非数据类),比如activity中定义的监听方法;需要导入完整类名

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <layout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto">
  4. <data>
  5. <variable
  6. name="presenter"
  7. type="com.qiangxi.databindingdemo.acitivity.XmlLabelActivity"/>
  8. </data>
  9. <LinearLayout
  10. android:layout_width="match_parent"
  11. android:layout_height="match_parent"
  12. android:orientation="vertical">
  13. <TextView
  14. android:layout_width="match_parent"
  15. android:layout_height="50dp"
  16. android:onClick="@{() -> presenter.onViewClick()}"/>
  17. </LinearLayout>
  18. </layout>

import标签

import标签用于导入包,让我们可以直接使用某个类的静态方法或静态字段。
type属性(必填):

该属性的作用和variable标签类似,用于指定导入类的全路径。
alias属性(可选):

当多个import标签的type属性值相同时,如果不做区分,在编译时会报错,因为默认情况下,它们之间的别名都是相同的,为了能正常编译运行,就需要使用alias属性做区分。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <layout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto">
  4. <data>
  5. <import
  6. alias="textUtils01"
  7. type="android.text.TextUtils"/>
  8. <import
  9. alias="textUtils02"
  10. type="android.text.TextUtils"/>
  11. </data>
  12. <LinearLayout
  13. android:layout_width="match_parent"
  14. android:layout_height="match_parent"
  15. android:orientation="vertical">
  16. <TextView
  17. android:layout_width="match_parent"
  18. android:layout_height="50dp"/>
  19. </LinearLayout>
  20. </layout>

我们知道variable标签需要定义name属性,定义完毕之后,我们就可以根据这个name的名称进行相关方法调用. 

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/934693
推荐阅读
相关标签
  

闽ICP备14008679号