Android DataBinding学习和实践(二)
书承上文,这次我们来探究一下DataBinding中控件事件的绑定和可观察对象的使用。
目录
一、自定义DataBinding生成类名以及import的使用
1、自定义DataBinding生成类名
2、import的使用
二、DataBinding中控件事件绑定
三、Observable Data Object(可观察数据对象)
1、Observable Field
2、Obserable Collections
3、Obserable Object
一、自定义DataBinding生成类名以及import的使用
1、自定义DataBinding生成类名
在上篇文章中我们使用了一个名为ActivityMainBinding的类,这个类是DataBinding通过布局文件名称来生成的,规则是将布局文件的下划线去掉,每个单词首字母大写并且加上Binding后缀。但是,这样生成的名字有可能不符合实际开发的命名规则,因此,我们可以自定义生成名称。
首先,我们在布局文件的<data>标签里设置它的class属性,如下
<data class="MainBinding"><variablename="user"type="com.silencer.db.entity.User" /><variablename="arr"type="String[]" /></data>
这样,系统给我们生成的类名就是MainBinding了,它位于**.databinding包下,如图
这里的MainBindingImpl继承MainBinding的类。同时,我们可以修改<data>的class值的形式来设置生成类在不同的包下等等。如<data class=".MainBinding">代表MainBinding位于根目录包下。
2、import的使用
在布局文件中,如果引入的变量包名过长,那么会很影响阅读。因此,我们可以使用import来导入某类。如下
<data class="MainBinding"><import type="com.silencer.db.entity.User"/><variablename="user"type="User" /><variablename="arr"type="String[]" /></data>
可以发现,在使用import导入之后,我们对变量user的声明变得很简洁。同时,使用import导入某个类之后,我们可以很简洁的使用它的静态变量和方法,如下 可以看到我们在text的属性中引用了User类的静态变量Tag。
<TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/main_text"android:text='@{User.TAG}'app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" />
如果引入多个类时,可能会发生冲突,这个时候就可以通过指定import的alias属性来给它设置一个别名,如下所示将User改名为People
<data class="MainBinding"><import type="com.silencer.db.entity.User" alias="People"/><variablename="user"type="People" /><variablename="arr"type="String[]" /></data>
二、DataBinding中控件事件绑定
DataBinding的强大之处不仅在于可以动态绑定数据,而且还可以绑定控件的事件。我们以TextView的点击事件为例,使用三种方法来进行绑定。
①布局对应Activity的方法
我们首先在主函数中实现一下View.OnClickListener接口的onClick方法,如下
switch (v.getId()){case R.id.main_text:Toast.makeText(MainActivity.this,"点击了文本",Toast.LENGTH_SHORT).show();break;}
然后在布局文件中绑定这个事件,如下所示
<TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/main_text"android:text='@{People.TAG}'android:onClick="onClick"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" />
可以看到onclick属性中填入了onClick,这个值就是activity中匹配点击事件的接口。我们运行一下看看结果。
②自定义类成员方法
我们新建一个类,类名为TVEvent,如下
public class TVEvent {public static void tvClick1(View v){((TextView)v).setText("通过tvClick1点击事件");}public void tvClick2(View v){((TextView)v).setText("通过tvClick2点击事件");}
}
该类有一个公共的静态方法和一个公共的成员方法。我们在布局文件中引入这个类并声明变量。
......<import type="com.silencer.db.callback.TVEvent"/><variablename="tvEvent"type="TVEvent" />
......
我们还需要在MainActivity给这个变量赋值,这里不贴代码,不懂得可以看第一篇文章。然后我们就可以使用成员方法来实现点击事件的绑定。
...... <TextView......android:text='@{People.TAG}'android:onClick="@{(v)->tvEvent.tvClick2(v)}"....../>
......
这里用的时lambda表达式来引用的。
③静态方法
这里和第二点很像,只不过可以直接使用类名.静态方法来绑定,如
...... <TextView......android:text='@{People.TAG}'android:onClick="@{(v)->TVEvent.tvClick1(v)}"....../>
......
注意,使用第二第三点方法时,要注意对象方法返回值与实践匹配的方法返回值一致,如onlick的返回值是void,那么tvClick1和tvClick2的返回值都应该为void
三、Observable Data Object(可观察数据对象)
注意,这里就是重点了。我们前面讲了这么久就是为了这一部分。DataBinding的提出就是为了使用可观察数据对象来实现动态更新。那么,什么是可观察数据对象呢?
从字面上来看,可观察对象就是你可以观察它的变化,相当于你在现实生活中订阅了某个公众号。当公众号更新时,他就会发送信息给你,告诉你它更新了内容。同理,可观察对象就是这个“公众号”。
可观测数据对象一般分为三类,分别为Observable Field,Obserable Collections和Obserable Object。我们一一讲解。
1、Observable Field
Observable Field(可观察字段),是一种拥有单一字段且自包可观察的对象,有如下几种:
- ObservableBoolean
- ObservableByte
- ObservableChar
- ObservableShort
- ObservableInt
- ObservableLong
- ObservableFloat
- ObservableDouble
- ObservableParcelable
这些对象都是包含着对应后缀的变量值,如ObservableBoolean是一个有boolean值的可观察对象。这些变量可以供其他对象订阅,在它们发生变化时,就会通知所有的观察者更新自己的信息。我们以ObservableInt来举例说明。
首先我们在布局文件中声明一个ObservableInt对象并将它绑定到TextView的text属性上面,如下
......<variablename="oInt"type="androidx.databinding.ObservableInt" />
............<TextView......android:id="@+id/main_text"android:text='@{String.valueOf(oInt)}'android:onClick="@{(v)->tvEvent.tvClick2(v)}"...... />
......
然后我们传入要观察的ObservableInt对象,如下
......
ObservableInt oInt = new ObservableInt(0);
binding.setOInt(oInt);new Thread(new Runnable() {@Overridepublic void run() {while (true){try {Thread.sleep(1500);} catch (InterruptedException e) {e.printStackTrace();}oInt.set(oInt.get()+17);}}}).start();
......
运行一下就可以看到文本在不停变动了,由于我不能截gif,所以没贴截图了。
2、Obserable Collections
Obserable Collections(可观察集合)是一组可以被观察的对象,它可以在集合发生变化时通知观察者,例如添加元素时。使用可观察集合的方法和可观察字段相近,话不多说直接看代码。
......<variablename="list"type="androidx.databinding.ObservableList" />
............<TextView......android:id="@+id/main_text"android:text='@{list.size()>0?list[list.size()-1]:""}'android:onClick="@{(v)->tvEvent.tvClick2(v)}"...... />
......
...... ObservableList<String> oList = new ObservableArrayList<>();binding.setList(oList);new Thread(() -> {while (true){try {Thread.sleep(1500);} catch (InterruptedException e) {e.printStackTrace();}oList.add(System.currentTimeMillis()+"");}}).start();
......
运行即可看见效果。
3、Obserable Object
Obserable Object(可观察对象)是指实现Observable接口的对象,实际开发我们通常继承BaseObservable类来实现可观察对象。它可以通过在成员方法中调用notifyChange或notifyPropertyChanged来控制什么时候通知观察者发生了变化。使用方法也很简单,这里举个例子给大家说明一下。
首先,我们创建一个类,把他命名为ObservableBook,代码如下
public class ObservableBook extends BaseObservable {@Bindableprivate double price;private String name;private String author;public ObservableBook() {}public ObservableBook(double price, String name, String author) {this.price = price;this.name = name;this.author = author;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;notifyPropertyChanged(BR.price);}public String getName() {return name;}public void setName(String name) {this.name = name;notifyChange();}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;notifyChange();}
}
这里price属性我使用notifyPropertyChanged方法来通知观察者,其他两个属性使用的时notifyChange来通知的,效果都一样。
DataBinding会生成一个BR类,他持有你声明的变量以及通过@Bindable注解标记的字段或get方法
使用的方法和其他可观察对象一样,这里就不举例了。本文到此结束,后面会给大家介绍生命周期绑定以及双向绑定的使用。
本BLOG上原创文章未经本人许可,不得用于商业用途。转载请注明出处并告知本人,否则保留追究法律责任的权利。
Android DataBinding学习和实践(二)相关推荐
- 疯狂Android讲义 - 学习笔记(二)
疯狂Android讲义 - 学习笔记(二) Android应用的用户界面编程 2.1 界面编程与视图(View)组件 Android应用的绝大部分UI组件放在android.widget.androi ...
- Android Databinding学习
一.启用Databinding android { dataBinding { enabled = true } } 二.xml布局文件 <layout xmln ...
- SEO小白学习与实践(二):SEO相关基础知识与自有网站诊断
前言 两年前建网站的时候,一切都是从百度检索开始的,遇到问题就问度娘.后来发现,这样的方法不是很好.度娘可以帮助解决铁定问题,但是非常系统的知识最好还是从书本上获取.于是,这次SEO学习咱就改变思路, ...
- Android 动画学习笔记(二)
引言 学习动画的过程中,发现并没有那么简单. 以前只知道补间动画,属性动画,现在觉得真是弟弟. 话不多说,开始总结. 本文引用了一些网络图片,在此感谢各位作者. 转场动画 Android提供了三种现成 ...
- Android动画学习笔记(二)——动画插值器Interpolator
前言:上篇博客我们对补间动画的xml及代码生成做了简单的介绍,今天我们来讲讲动画的一个核心类Interpolator插值器,对于数学好的童鞋来说,学习本节内容就soeasy了!(ps:本人数学很差,都 ...
- 我的android绘图学习笔记(二)
然后试一下从ArrayList里面读数据,画折线图 package com.test; import java.util.ArrayList; import java.util.Iterator; i ...
- Android开发学习笔记(二)——编译和运行原理(1)
接着上一篇的内容,继续从全局了解Android.在清楚了Android的平台架构(可以看作是静态原理)后,还需要掌握其动态原理.动态原理包含两部分,一部分是编译原理,另一部分是运行原理.有人会说,搭建 ...
- Android开发学习笔记(二)——编译和运行原理(2)
上篇介绍了应用程序从源码到安装包的整个过程,考虑到篇幅过长,遂将原理内容分成两部分来介绍.接下来,在本篇中,主要介绍Android平台应用程序的运行原理. 在阅读了SDK文档中"Applic ...
- Android SurfaceFlinger学习
重学系列 1.Android 重学系列 SurfaceFlinger的概述 2.Android 重学系列 Ashmem匿名共享内存 3.Android 重学系列 SurfaceFlinger 的初始化 ...
最新文章
- (0070)iOS开发之AVFoundation枚举属性注解
- python界面开发工具免费_Python程序员必备的四款开发工具
- 使用SearchView报错java.lang.UnsupportedOperationException: Failed to resolve ...
- Oracle 数据定义语言,oracle 数据定义语言(DDL)语法
- PTA-6-3 使用函数的选择法排序 (25分)(C语言)
- 填充 孔洞_防火门或防火窗与墙洞口的间隙,填充材料的选择
- Java Web项目在Linux服务器自动化部署
- Android ui 测试课堂笔记
- 注释和特殊字符(HTML)
- 开源icon、SVG、字体图标库收集
- numpy数组打印格式设置
- 【转】SD-WAN,到底是什么*****
- html 多选框 下拉,一个模拟html下拉多选框的原生实现.
- 样本不平衡问题分析与部分解决办法
- easyui实例案例介绍
- 来自《星际迷航》的灵感启发
- Hex Fiend – 十六进制编辑 [Mac]
- 01 hbuilder账号的注册
- Android基础整合项目之节日群发助手(二)
- React类式组件基础内容补充
热门文章
- c语言求三门课总成绩,C语言编程,求高手 编写程序求某班20位学生三门课(英语,数学,语文)总成绩,并按照总成绩从大到小...
- JavaScript 递归算法
- STOP!运营小程序,不知道这4种方法,是不可能实现小程序裂变的
- 一位二本毕业4年的java程序员
- ICMP拒绝服务攻击(原始套接字系列四)
- 搭建一个属于自己的独立线上商城网站
- Python读写文件(txt, csv等)小结
- [风一样的创作]Layui图标列表,二次封装
- linux 打包zip
- java解析网页全过程_Web页面的解析过程