Android Data Binding Library 官方文档.docx
- 文档编号:24238474
- 上传时间:2023-05-25
- 格式:DOCX
- 页数:28
- 大小:91.13KB
Android Data Binding Library 官方文档.docx
《Android Data Binding Library 官方文档.docx》由会员分享,可在线阅读,更多相关《Android Data Binding Library 官方文档.docx(28页珍藏版)》请在冰豆网上搜索。
AndroidDataBindingLibrary官方文档
AndroidDataBindingLibrary官方文档
构建环境
使用gradle插件1.5-alpha1以上
在build.gradle添加如下声明
android{
....
dataBinding{
enabled=true
}
}
注:
如果子Moudle使用了数据绑定,那么最好也在appMoudle中配置一下
数据绑定的布局文件
书写第一组数据绑定表达式
xmlversion="1.0"encoding="utf-8"?
>
android=" android: orientation="vertical" android: layout_width="match_parent" android: layout_height="match_parent"> layout_width="wrap_content" android: layout_height="wrap_content" android: text="@{user.firstName}"/> layout_width="wrap_content" android: layout_height="wrap_content" android: text="@{user.lastName}"/> 如上,在标签中 布局中使用“@{}”语法来书写表达式。 如为TextView的文本设置成user.firstName: layout_width="wrap_content" android: layout_height="wrap_content" android: text="@{user.firstName}"/> 数据对象 aplain-oldJavaobject(POJO)forUser: publicclassUser{ publicfinalStringfirstName; publicfinalStringlastName; publicUser(StringfirstName,StringlastName){ this.firstName=firstName; this.lastName=lastName; } } 也可以如下书写: publicclassUser{ privatefinalStringfirstName; privatefinalStringlastName; publicUser(StringfirstName,StringlastName){ this.firstName=firstName; this.lastName=lastName; } publicStringgetFirstName(){ returnthis.firstName; } publicStringgetLastName(){ returnthis.lastName; } } 在数据绑定中,访问@{user.firstName},那么默认就会访问同名的属性firstName,或对应的getFirstName方法 绑定数据 默认情况下,绑定类将基于布局文件的名称来产生 如布局文件为main_activity.xml,这样生成的类是MainActivityBinding 如下设置Activity的contentView: @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); MainActivityBindingbinding=DataBindingUtil.setContentView(this,R.layout.main_activity); Useruser=newUser("Test","User"); binding.setUser(user); } 上文说,在xml中用表达式可以获取数据,那么同样的,在代码中也可以设置数据,如这里的: binding.setUser(user); 还可以使用inflate的方式来获取生成数据绑定类: MainActivityBindingbinding=MainActivityBinding.inflate(getLayoutInflater()); 如果是在一个adapter中来使用,那么可以如下: ListItemBindingbinding=ListItemBinding.inflate(layoutInflater,viewGroup,false); //or ListItemBindingbinding=DataBindingUtil.inflate(layoutInflater,R.layout.list_item,viewGroup,false); 事件处理 可以在xml中编写表达式处理事件。 比如View.OnLongClickListener有一个方法为onLongClick(),那么它对应的事件就是android: onLongClick。 当绑定事件后,会自动将该listener绑定在View上。 处理事件有两种方法, 1.方法引用: 可以引用符合listener任意方法签名规则的方法。 2.监听器绑定: 使用lambda表达式 方法引用 比如定义一个符合OnClickListener#onClick(Viewview)方法参数签名规则的方法: publicclassMyHandlers{ publicvoidonClickFriend(Viewview){...} } 如下在xml中绑定并使用: xmlversion="1.0"encoding="utf-8"? > android=" android: orientation="vertical" android: layout_width="match_parent" android: layout_height="match_parent"> layout_width="wrap_content" android: layout_height="wrap_content" android: text="@{user.firstName}" android: onClick="@{handlers: : onClickFriend}"/> 监听器绑定 表达式使用的方法就可以定义的比较随意了,不用像”方法引用”那样遵循特定规则,如一个方法 publicclassPresenter{ publicvoidonSaveClick(Tasktask){} } 使用它 xmlversion="1.0"encoding="utf-8"? > android=" layout_width="match_parent"android: layout_height="match_parent"> layout_width="wrap_content"android: layout_height="wrap_content" android: onClick="@{()->presenter.onSaveClick(task)}"/> 注: 只允许由lambda表达式作为根元素的表达式 像上面,我们并没有定义onClick(android.view.View)参数view。 监听器绑定,允许我们忽略所有的参数。 如果想要使用参数,可以忽略参数类型,而随意定义一个名字。 比如,上面的表达式中写上view参数: android: onClick="@{(view)->presenter.onSaveClick(task)}" 如果要使用该参数,可以在对应回调方法中也定义上: publicclassPresenter{ publicvoidonSaveClick(Viewview,Tasktask){} } android: onClick="@{(theView)->presenter.onSaveClick(theView,task)}" 您可以使用一个lambda表达式,它操作多个参数: publicclassPresenter{ publicvoidonCompletedChanged(Tasktask,booleancompleted){} } android: layout_width="wrap_content" android: layout_height="wrap_content" android: onCheckedChanged="@{(cb,isChecked)-> pleteChanged(task,isChecked)}"/> 如果事件有返回值,那么我们定义的方法,最好也有相应的返回值。 如: publicclassPresenter{ publicbooleanonLongClick(Viewview,Tasktask){} } android: onLongClick="@{(theView)->presenter.onLongClick(theView,task)}" 如果表达式对于null对象无法评估,那最好对应方法返回一个基本数据类型的默认值。 比如nullforreferencetypes,0forint,falseforboolean. 如下使用一个三元表达式: android: onClick="@{(v)->v.isVisible()? doSomething(): void}" 避免复合监听 存在一些专门的单击事件处理程序,他们需要一个属性(除了android: onClick)以避免冲突: 这里写图片描述 布局细节 import 在标签中,import一些class,就像在Java代码中一样 在layout布局中使用: android: text="@{user.lastName}" android: layout_width="wrap_content" android: layout_height="wrap_content" android: visibility="@{user.isAdult? View.VISIBLE: View.GONE}"/> 当有类名称冲突,其中一个类可以重命名一个别名: alias="Vista"/> 在 android: text="@{((User)(user.connection)).lastName}" android: layout_width="wrap_content" android: layout_height="wrap_content"/> 也可以在表达式中运用静态属性或方法,使用MyStringUtils.capitalize(): … android: text="@{MyStringUtils.capitalize(user.lastName)}" android: layout_width="wrap_content" android: layout_height="wrap_content"/> 像java代码中一样,也会自动引入java.lang.* Variable 可以定义多个 这些variable变量在编译时会进行类型检查,如果一个variable实现了Observable接口或是一个Observable的collection,那就需要在type中声明;如果不是一个Observable的实现,那么该variable就不会被观察到 不同的配置有不同的布局文件(如横屏或竖屏),在这些布局文件之间,不能定义相互冲突的变量。 自动生成的绑定类,对每个variable,都会生成setter和getter方法。 在setter方法被调用前,它会有一个默认值,比如空引用类型null、int类型0、boolean类型false 一个特定的变量context在表达式需要时,会被生成。 这个context值为根view的getContext()值。 自定义绑定classnames 默认情况下,基于布局文件的名称而生成绑定类,开头大写,然后移除下划线,再加上后缀”Binding”。 这个类将被放置在一个数据绑定包中,该包位于moudle包下。 例如,布局文件contact_item.xml将生成ContactItemBinding。 如果moudle的包名为com.example.my.app,那么它将被放置在com.example.my.app.databinding下 通过调整data元素的class属性,绑定类可以重命名或放置在不同的包。 例如: ... 这会生成在moudle下的databinding包下,如果要生成moudle包下,可以使用”.”前缀: ... 在下面这种情况下,ContactItem直接生成在模块包下。 可以使用任何完整的包路径: ... include variables可以传递给使用了include标签的子布局中,如 xmlversion="1.0"encoding="utf-8"? > android=" xmlns: bind=" android: orientation="vertical" android: layout_width="match_parent" android: layout_height="match_parent"> bind: user="@{user}"/> bind: user="@{user}"/> 如上,在name.xml和contract.xml中都可以使用变量user了 不支持在merge下直接使用include的情形,如下: xmlversion="1.0"encoding="utf-8"? > bind: user="@{user}"/> bind: user="@{user}"/> 表达式语言 共同的特征 表达式语言看起来很像Java表达式。 如下这些都是相同的: Mathematical+-/*% Stringconcatenation+ Logical&&|| Binary&|^ Unary+-! ~ Shift>>>>><< Comparison==><>=<= instanceof Grouping() Literals-character,String,numeric,null Cast Methodcalls Fieldaccess Arrayaccess[] Ternaryoperator? : 例: android: text="@{String.valueOf(index+1)}" android: visibility="@{age<13? View.GONE: View.VISIBLE}" android: transitionName='@{"image_"+id}' 丢失的操作符 this、new、super如这些,还是只能在java类中使用 合并null操作符 如下使用“? ? ”操作符 android: text="@{user.displayName? ? user.lastName}" 等价于: android: text="@{user.displayName! =null? user.displayName: user.lastName}" 属性引用 如下,user有getLastName(),可以简单引用: android: text="@{user.lastName}" 避免NullPointerException 数据绑定代码会自动检查null值,避免NullPointerException。 像上文说过,会给定一个默认值 集合 一般的集合都可以使用”[]”操作符: arrays,lists,sparselists,andmaps。 例 … android: text="@{list[index]}" … android: text="@{sparse[index]}" … android: text="@{map[key]}" 字符串字面值 如下,可以使用单引号在属性值上,用双引号在字符串字面值上: android: text='@{map["firstName"]}' 也可以反过来使用: android: text="@{map[`firstName`}" android: text="@{map['firstName']}" 资源 可以使用正常的访问资源的表达式语法: android: padding="@{large? @dimen/largePadding: @dimen/smallPadding}" 可以为格式字符串和复数提供参数: android: text="@{@string/nameFormat(firstName,lastName)}" android: text="@{@plu
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android Data Binding Library 官方文档 官方 文档