Android Data Binding Library
来源:互联网 发布:霍建华与林心如 知乎 编辑:程序博客网 时间:2024/06/05 18:43
前言
本文介绍了如何使用数据绑定库写声明布局和减少绑定应用程序逻辑和布局所需的代码,在官方介绍基础上加上理解整理而成。
准备
新建一个 Project,确保 Android 的 Gradle 插件版本不低于 1.5.0-alpha1:
classpath ‘com.android.tools.build:gradle:1.5.0’ 然后修改对应模块(Module)的 build.gradle:
dataBinding { enabled true}
布局文件
Databinding 布局文件格式
layout xmlns:android="http://schemas.android.com/apk/res/android"><data> <variable name="key" type="String" /> </data> <!--原先的根节点(Root Element)--> <LinearLayout> .... </LinearLayout></layout>
注意: 一个的Layout中至多能有两个子节点。多于两个子节点会出异常。Key为引用,下面调用方式需要使用key.xxx 进行调用
数据对象
添加一个 POJO 类 - User,非常简单,两个属性以及他们的 getter 和 setter。
package dragger2.nuoyuan.com.myapplication.bean;public class Xuser implements Cloneable { private final String firstName; private final String lastName; public Xuser(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } public String getFirstName() { return this.firstName; } public String getLastName() { return this.lastName; } @Override public Xuser clone() throws CloneNotSupportedException { Xuser mail = (Xuser) super.clone(); return mail; }}
稍后,我们会新建一个 Xuser类型的变量,然后把它跟布局文件中声明的变量进行绑定。
定义 Variable
回到布局文件,在 data 节点中声明一个 Xuser 类型的变量 user。
<data> <variable name="user" type="dragger2.nuoyuan.com.myapplication.bean.Xuser" /></data>
其中 type 属性就是我们在 Java 文件中定义的 Xuser类。
当然,data 节点也支持 import,所以上面的代码可以换一种形式来写。
<data> <import type="dragger2.nuoyuan.com.myapplication.bean.Xuser" /> <variable name="user" type="User" /></data>
然后我们刚才在 build.gradle 中添加的那个插件 - com.android.databinding 会根据 xml 文件的名称 Generate 一个继承自 ViewDataBinding 的类。 当然,IDE 中看不到这个文件,需要手动去 build 目录下找。
例如,这里 xml 的文件名叫 activity_basic.xml,那么生成的类就是 ActivityBasicBinding。
注意
java.lang.* 包中的类会被自动导入,可以直接使用,例如要定义一个 String 类型的变量:
<variable name="firstName" type="String" />
绑定 Variable (变量)
TestdataactivityBinding testdataactivityBinding = DataBindingUtil.setContentView(this, R.layout.testdataactivity); Xuser user = new Xuser("Test", "User"); testdataactivityBinding.setUser(user);
除了使用框架自动生成的 TestdataactivityBinding ,我们也可以通过如下方式自定义类名。
注意
TestdataactivityBinding 类是自动生成的,所有的 set 方法也是根据 variable 名称生成的。例如,我们定义了两个变量。
<data> <variable name="firstName" type="String" /> <variable name="lastName" type="String" /></data>
那么就会生成对应的两个 set 方法。
setFirstName(String firstName);setLastName(String lastName);
使用 Variable
数据与 Variable 绑定之后,xml 的 UI 元素就可以直接使用了。
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content"android:text="@{user.lastName}" />
至此,一个简单的数据绑定就完成了,可参考完整代码
Databinding:https://github.com/yatou252303/googledatabinding
一些高级用法
Onclick 设置
方式1
Onclick(View view)
/** * 弹出Toash */public class MyHandlers { public void onClickFriend(View view) { Toast.makeText(MyApp.context, "dataBinding", 500).show(); }}
<?xml version="1.0" encoding="utf-8"?><layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="handler" type="dragger2.nuoyuan.com.myapplication.HandleClickListener.MyHandlers" /> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="50dp" android:onClick="@{handler::onClickFriend}" android:text="@{user.lastName}" /> </LinearLayout></layout>
方式2
Onclick(Parameter var1,Parameter Var2)
public class Presenter { public void onSaveClick(Xuser task) { Toast.makeText(MyApp.context, task.getFirstName(), 500).show(); } public void onSaveClick(Context context) { Toast.makeText(MyApp.context, "dddddd", 500).show(); }}
<?xml version="1.0" encoding="utf-8"?><layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="click" type="dragger2.nuoyuan.com.myapplication.HandleClickListener.Presenter" /> <variable name="user" type="dragger2.nuoyuan.com.myapplication.bean.Xuser" /> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:layout_width="match_parent" android:layout_height="100dp" android:gravity="center" android:onClick="@{(view)->click.onSaveClick(user) }" android:text="@{user.firstName}" /> <TextView android:layout_width="wrap_content" android:layout_height="50dp" android:text="@{user.firstName}" /> </LinearLayout></layout>
Include 嵌套Databinging 用法
<?xml version="1.0" encoding="utf-8"?><layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:bind="http://schemas.android.com/apk/res-auto"> <data> <import type="java.util.List" /> <variable name="user" type="dragger2.nuoyuan.com.myapplication.bean.Xuser" /> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <include layout="@layout/name" bind:user="@{user}" /> <include android:id="@+id/views" layout="@layout/contact" bind:user="@{user}" /> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="include" android:text="@{user.firstName}" /> </LinearLayout> </LinearLayout></layout>
在Include的布局文件中必须要有 user
<?xml version="1.0" encoding="utf-8"?><layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="dragger2.nuoyuan.com.myapplication.bean.Xuser" /> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="50dp" android:background="@color/colorAccent" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.lastName}" /> <TextView android:id="@+id/innertext" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout></layout>
构建过程中编译器会对应Databinding布局文件生成Binding文件
而且会对每一个设置Id的组件的生成final Static 成员变量
其中view 是
<include android:id="@+id/views" layout="@layout/contact" bind:user="@{user}" />
的id.这样就可以方便的进行调用的,而不是使用findViewByid()
DataBinding 支持的操作符号
Mathematical + - / * %String concatenation +Logical && ||Binary & | ^Unary + - ! ~Shift >> >>> <<Comparison == > < >= <=instanceofGrouping ()Literals - character, String, numeric, nullCastMethod callsField accessArray access []Ternary operator ?:android:text="@{String.valueOf(index + 1)}"android:visibility="@{age < 13 ? View.GONE : View.VISIBLE}"android:transitionName='@{"image_" + id}'
Missing Operations
thissupernew
增加的操作
android:text="@{user.displayName ?? user.lastName}"
DataBinding 在ListAdapter 和 RecycleView中的用法DataBinding Import用法以及一些基本数据类型的使用
查看源码
DataBinding 布局中使用的Import导入具体的包名就可以使用相应的包功能这点同java类似
基本类型可以不显示进行导包
<data> <import type="android.util.SparseArray" /> <import type="java.util.Map" /> <import type="java.util.List" /> <variable name="list" type="List<String>" /> <variable name="sparse" type="SparseArray<String>" /> <variable name="map" type="Map<String, String>" /> <variable name="index" type="int" /> <variable name="key" type="String" /></data>
用法
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="list[index]:" android:textStyle="bold" />
DataBinding 类型转换使用
请查看demo
DataBinding 自定义的属性用法的
自定义使用起来相当好用,而且不需要在attrs.xml中进行声明,只要提供相应set方法即可。Databinding会自动搜索相应的Set方法
<dragger2.nuoyuan.com.myapplication.utils.NYImageView android:id="@+id/img" android:layout_width="match_parent" android:layout_height="wrap_content" app:error="@{@drawable/error}" app:imageUrl="@{imageUrl}" />
提供调用函数的,需要为静态
@BindingAdapter({"imageUrl", "error"})public static void loadImage(ImageView view, String url, Drawable error) { Glide.with(activity).load(url).into(view);}
Bindview之后设置显示Url地址
attrsetActivityBinding.setImageUrl("http://tse4.mm.bing.net/th?id=OIP.MKt6WVLkDWmz5ZKgzujUcwEsEs&w=204&h=201&c=7&qlt=90&o=4&dpr=1.1&pid=1.7");
DataBinding 中ViewStub 用法
请查看demo
demo地址:https://github.com/yatou252303/googledatabinding
引用:
参考 db demo https://github.com/LyndonChin/MasteringAndroidDataBinding
googledb 翻译 http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0603/2992.html
官方地址 https://developer.android.com/topic/libraries/data-binding/index.html#generated_binding
- Android--Data Binding Library
- Android Data Binding Library
- android Data Binding Library
- Data Binding Library
- Data Binding Library
- Android MVVM 开发模式插件库 Android Data Binding Library
- Android数据绑定库Data Binding Library介绍
- 数据绑定数据库详解Android Data Binding Library
- Android Data Binding Library 官方文档(译)
- Data Binding Library(Data Binding库官方指南)
- Android Data Binding 技术
- Android Data Binding学习
- Android Data Binding
- Android Data Binding
- android data binding
- Android Data Binding 技术
- Android Data Binding
- 精通 Android Data Binding
- 怎么应用vertical-align,才能生效?
- 常见的排序算法示例(3)-归并排序、堆排序
- SpringMail发送QQ邮件
- Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)
- Android6.0之Activity的管理与启动模式
- Android Data Binding Library
- windows下搭建sftp服务端,并使用FileZillaClient测试
- Oracle建表约束格式
- jQuery File Upload踩坑记录
- 线程共享与私有
- Leetcode 290. Word Pattern
- 开关电源EMI设计与整改策略!!!
- Mxnet(4)-fcn训练自己的数据
- JS 跨时区时间解决方案