




已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Android Data Binding Library 官方文档构建环境使用gradle插件1.5-alpha1以上 在build.gradle添加如下声明android . dataBinding enabled = true 注:如果子Moudle使用了数据绑定,那么最好也在app Moudle中配置一下数据绑定的布局文件书写第一组数据绑定表达式 如上,在标签中 描述了一个变量user,它对应的类型为”com.example.User” 布局中使用“ ”语法来书写表达式。如为TextView的文本设置成user. firstName:数据对象a plain-old Java object (POJO) for User:public class User public final String firstName; public final String lastName; public User(String firstName, String lastName) this.firstName = firstName; this.lastName = lastName; 也可以如下书写:public class User private final String firstName; private final String lastName; public User(String firstName, String lastName) this.firstName = firstName; this.lastName = lastName; public String getFirstName() return this.firstName; public String getLastName() return this.lastName; 在数据绑定中,访问user.firstName,那么默认就会访问同名的属性firstName,或对应的getFirstName方法绑定数据默认情况下,绑定类将基于布局文件的名称来产生 如布局文件为main_activity.xml,这样生成的类是 MainActivityBinding 如下设置Activity的contentView:Overrideprotected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); MainActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity); User user = new User(Test, User); binding.setUser(user);上文说,在xml中用表达式可以获取数据,那么同样的,在代码中也可以设置数据,如这里的:binding.setUser(user); 还可以使用inflate的方式来获取生成数据绑定类:MainActivityBinding binding = MainActivityBinding.inflate(getLayoutInflater();如果是在一个adapter中来使用,那么可以如下:ListItemBinding binding = ListItemBinding.inflate(layoutInflater, viewGroup, false);/orListItemBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false);事件处理可以在xml中编写表达式处理事件。比如 View.OnLongClickListener有一个方法为onLongClick(),那么它对应的事件就是android:onLongClick。当绑定事件后,会自动将该listener绑定在View上。处理事件有两种方法, 1. 方法引用:可以引用符合listener 任意方法签名规则的方法。 2. 监听器绑定:使用lambda表达式方法引用比如定义一个符合OnClickListener#onClick(View view)方法参数签名规则的方法:public class MyHandlers public void onClickFriend(View view) . 如下在xml中绑定并使用: 监听器绑定表达式使用的方法就可以定义的比较随意了,不用像”方法引用”那样遵循特定规则,如一个方法public class Presenter public void onSaveClick(Task task)使用它 presenter.onSaveClick(task) / 注:只允许由lambda表达式作为根元素的表达式像上面,我们并没有定义onClick(android.view.View) 参数view。监听器绑定,允许我们忽略所有的参数。如果想要使用参数,可以忽略参数类型,而随意定义一个名字。比如,上面的表达式中写上view参数:android:onClick=(view) - presenter.onSaveClick(task)如果要使用该参数,可以在对应回调方法中也定义上:public class Presenter public void onSaveClick(View view, Task task)android:onClick=(theView) - presenter.onSaveClick(theView, task)您可以使用一个lambda表达式,它操作多个参数:public class Presenter public void onCompletedChanged(Task task, boolean completed) pleteChanged(task, isChecked) /如果事件有返回值,那么我们定义的方法,最好也有相应的返回值。如:public class Presenter public boolean onLongClick(View view, Task task)android:onLongClick=(theView) - presenter.onLongClick(theView, task)如果表达式对于null对象无法评估,那最好对应方法返回一个基本数据类型的默认值。 比如 null for reference types, 0 for int, false for boolean.如下使用一个三元表达式:android:onClick=(v) - v.isVisible() ? doSomething() : void避免复合监听存在一些专门的单击事件处理程序,他们需要一个属性(除了android:onClick)以避免冲突: 这里写图片描述布局细节import在标签中,import 一些class,就像在Java 代码中一样 在layout布局中使用:当有类名称冲突,其中一个类可以重命名一个别名:在标签来使用import中的类型: 也可以在表达式中运用静态属性或方法,使用MyStringUtils.capitalize(): 像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()值。自定义绑定 class names默认情况下,基于布局文件的名称而生成绑定类,开头大写,然后移除下划线,再加上后缀”Binding”。这个类将被放置在一个数据绑定包中,该包位于moudle包下。例如, 布局文件contact_item.xml将生成ContactItemBinding。如果moudle的包名为com.example.my.app, 那么它将被放置在com.example.my.app.databinding下通过调整data元素的class属性,绑定类可以重命名或放置在不同的包。例如: .这会生成在moudle下的databinding包下,如果要生成moudle包下,可以使用”.”前缀: .在下面这种情况下,ContactItem直接生成在模块包下。可以使用任何完整的包路径: .includevariables可以传递给使用了include标签的子布局中,如 如上,在name.xml和contract.xml中都可以使用变量user了不支持在merge下直接使用include的情形,如下: 表达式语言共同的特征表达式语言看起来很像Java表达式。如下这些都是相同的:Mathematical + - / * %String concatenation +Logical & |Binary & | Unary + - ! Shift = =instanceofGrouping ()Literals - character, String, numeric, nullCastMethod callsField accessArray access Ternary operator ?:例:android:text=String.valueOf(index + 1)android:visibility=age 13 ? View.GONE : View.VISIBLEandroid: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, sparse lists, and maps。例 android:text=listindexandroid:text=sparseindexandroid:text=mapkey字符串字面值如下,可以使用单引号在属性值上,用双引号在字符串字面值上:android:text=mapfirstName也可以反过来使用:android:text=mapfirstNameandroid:text=mapfirstName资源可以使用正常的访问资源的表达式语法:android:padding=large? dimen/largePadding : dimen/smallPadding可以为格式字符串和复数提供参数:android:text=string/nameFormat(firstName, lastName)android:text=plurals/banana(bananaCount)当一个复数多个参数,: Have an orange Have %d orangesandroid:text=plurals/orange(orangeCount, orangeCount)一些资源需要显式类型的评估:数据对象任何POJO对象都可以用于数据绑定,但是更改POJO对象,并不会引起UI更新。有三种不同的数据更改通知机制:观察对象,观察字段和观察集合。当其中一个绑定到用户界面的可观察的数据对象,观察到数据对象的属性变化,用户界面将自动更新。观察对象(Observable Objects)A class implementing the Observable interface ,将被允许附加一个listener,来监听对象所有属性的改变Observable interface有一个机制来添加和删除listeners,但需要通知开发者。为了让开发变得更容易,提供一个基类,BaseObservable,它实现创建listener的注册机制。当属性数据改变时,数据类实现者需要响应通知。这是通过在getter上使用一个注解Bindable,并在setter中进行通知。private static class User extends BaseObservable private String firstName; private String lastName; Bindable public String getFirstName() return this.firstName; Bindable public String getLastName() return this.lastName; public void setFirstName(String firstName) this.firstName = firstName; notifyPropertyChanged(BR.firstName); public void setLastName(String lastName) this.lastName = lastName; notifyPropertyChanged(BR.lastName); Bindable 在编译时将生成一个BR class 。BR类文件将生成在moudle的package下。如果数据类的基类不能被改变,Observable interface的实现类可以使用PropertyChangeRegistry存储和有效地通知listeners。观察属性(ObservableFields)如果想做比创建上面的观察对象更少的工作,那么可以使用ObservableField 和它的同级的一些类型: ObservableBoolean, ObservableByte, ObservableChar, ObservableShort, ObservableInt, ObservableLong, ObservableFloat, ObservableDouble, and ObservableParcelable。它们都是一个包含单一属性的可观察的对象。为避免装箱、拆箱操作,可以在数据类中定义成 public final field private static class User public final ObservableField firstName = new ObservableField(); public final ObservableField lastName = new ObservableField(); public final ObservableInt age = new ObservableInt();如下,使用get或set来获取和设置属性值:user.firstName.set(Google);int age = user.age.get();观察集合(Observable Collections)一些应用程序使用更多的动态结构来保存数据。可观察集合允许通过key访问这些数据对象。当key是一个引用类型,如String,就可以用ObservableArrayMap。ObservableArrayMap user = new ObservableArrayMap();user.put(firstName, Google);user.put(lastName, Inc.);user.put(age, 17);在下面的布局中,就可以通过String类型的key来访问map中的数据: 当key是一个Integer时,可用ObservableArrayList:ObservableArrayList user = new ObservableArrayList();user.add(Google);user.add(Inc.);user.add(17);布局中使用ObservableArrayList: 生成Binding生成的绑定类,会链接布局的variables。正如前面所讨论的,绑定的名称和包可能是自定义的的。生成的所有绑定类都 extends ViewDataBinding。创建如前文所述,由相应的布局文件,而生成了相应的binding class。代码中使用它,需要LayoutInflater,如:MyLayoutBinding binding = MyLayoutBinding.inflate(layoutInflater);MyLayoutBinding binding = MyLayoutBinding.inflate(layoutInflater, viewGroup, false);如果布局已经inflate了,在某些场景时,可以单独绑定:MyLayoutBinding binding = MyLayoutBinding.bind(viewRoot);有时binding class 不能提前知道。在这种情况下,可以使用DataBindingUtil类创建绑定:ViewDataBinding binding = DataBindingUtil.inflate( LayoutInflater, layoutId, parent, attachToParent);ViewDataBinding binding = DataBindingUtil.bindTo(viewRoot, layoutId);View中使用id在布局中的每个使用了id的view,都会在binding class中创建出一个同名的public属性。这种绑定机制,比findViewById更快速。例: 在binding class中将会生成:public final TextView firstName;public final TextView lastName;不使用data binding的view,可以没有id,但有些view还是需要在代码中来访问Variable将为每个variable生成getter和setter方法。如 上面的代码将生成:public abstract com.example.User getUser();public abstract void setUser(com.example.User user);public abstract Drawable getImage();public abstract void setImage(Drawable image);public abstract String getNote();public abstract void setNote(String note);ViewStubViewStub 这种view与普通的view有一点不同。它的特点是,在一开始,它是不可见的;在需要可见时,会由配置的另一个布局来替换自身简单的说,如果要使用数据绑定,那么在ViewStub所配置的布局inflate之前,该布局就已建立好了data binding高级绑定动态Variable有时,特定的绑定类不会为人所知。例如,一个RecyclerView.Adapter操作的任意布局,不知其特定的绑定类。仍需要通过onBindViewHolder(VH, int)来绑定值。 在下面的例子中,RecyclerView中的所有布局,都绑定了一个”item”,有一个BindingHolder#getBinding() 返回ViewDataBinding 类型:public void onBindViewHolder(BindingHolder holder, int position) final T item = mItems.get(position); holder.getBinding().setVariable(BR.item, item); holder.getBinding().executePendingBindings();直接绑定当一个variable or observable发生了改变,绑定框架会安排在下一帧进行视图的改变。然而,有时希望立即发生改变。可以使用executePendingBindings()来强制执行后台线程你可以改变你的数据模型在一个后台线程,只要它不是一个集合。数据绑定框架将本地化每个变量和属性,以避免任何并发问题。Attribute Setters当view使用了绑定表达式,只要绑定值发生变化,生成的绑定类必须调用相应的setter方法。定制数据绑定框架的方式方法调用设置值。数据绑定框架允许自定义setter方法。自动Setters对于一个attribute,数据绑定框架将试图查找对应的setAttribute()。它的namespace并不重要,只关注attribute的name。如,TextView中的属性android:text使用了表达式,那么框架就会查找setText(String)。如果表达式返回的是int,那么将会查找setText(int)。所以,表达式需要返回正确的类型。数据绑定框架,支持创建一个布局元素(View|ViewGroup)中,并不存在的属性。 如下,生成的binding class中,将生成一个setDrawerListener(listener):重命名 Setters有一些属性的setter方法,与它的属性名不匹配。这些属性的setter可能会通过使用BindingMethods,来进行重命名。要求内问包含BindingMethod。例如ImageView有一个属性android:tint,它对应setter方法为setImageTintList(ColorStateList tint):BindingMethods( BindingMethod(type = android.widget.ImageView, attribute = android:tint, method = setImageTintList),)开发人员将不太可能需要重命名setter,因android属性框架已经实现。自定义Setters一些属性需要自定义绑定逻辑。例如,属性android:paddingLeft没有对应的setter方法,而在view中有一个方法为setPadding(left, top, right, bottom)。可以使用BindingAdapter来自定义一个关于属性android:paddingLeft的setter。例:BindingAdapter(android:paddingLeft)public static void setPaddingLeft(View view, int padding) view.setPadding(ding, view.getPaddingTop(), view.getPaddingRight(), view.getPaddingBottom();BindingAdapter也可以运用在自定义类型上。 当数据绑定框架
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025款小轿车借款合同的民间操作规程
- 2025企业港口物流专用线委托运营管理维护合同
- 2025年乡村振兴视角下文旅融合乡村旅游发展策略分析报告
- 2025年五金市场群体样本 五金买卖合同样本
- 2025年固态电池在移动通信设备中的续航时间优化报告
- 2025年中国工具用毛坯行业市场全景分析及前景机遇研判报告
- 2025预制混凝土销售合同
- 地锦草的植物学特点
- 婚姻终止后子女抚养权转让及财产分割执行合同
- 高端服务业小微企业员工薪酬绩效合同范本
- 2025年柳州市城中区人民法院招录聘用人员考试试题
- 2024年危险化学品典型事故案例反思
- 四川普通高中会考英语试卷及答案
- MOOC 电工电子实验基础-东南大学 中国大学慕课答案
- 营造林技能竞赛试题及答案
- 小学科学苏教四年级上册1单元动物大家族2《鱼类》教案
- 团队协作的五大障碍课件
- 一氧化碳中毒急救PPT课件(PPT 43页)
- JIS G4305-2021 冷轧不锈钢板材、薄板材和带材
- 计算机专业英语(第二版)整本书课件完整版电子教案(最新)
- 多晶硅还原装置操作规程
评论
0/150
提交评论