Android数据绑定DataBinding(二)入门篇
前言
之前写了Android数据绑定DataBinding(一)入门篇,很简单的记录了如何使用DataBinding,其初衷是想要代码中的数据发生改变,不需要繁琐的setText等操作,在最后说到了只需要将POJO继承一个BaseObservable即可,其实这只是冰山一角啦!!!
本文若有出入,请指正——来自小渣渣的颤抖
客官可移步小站查看本文http://fanjiajia.cn/2019/07/07/Android/flx1/
本文接着上一篇的内容,记录一下数据对象
和事件处理
数据对象(Data Object)
其实继承BaseObservable的javBean叫做数据对象,官网介绍如下:
Any plain old Java object (POJO) may be used for data binding, but modifying a POJO will not cause the UI to update. The real power of data binding can be used by giving your data objects the ability to notify when data changes. There are three different data change notification mechanisms, Observable objects, observable fields, and observable collections.
When one of these observable data object is bound to the UI and a property of the data object changes, the UI will be updated automatically.
大意是:
任何普通的Java对象(POJO)都可以用于数据绑定,但修改POJO不会导致UI更新。当数据改变的时候,您的数据对象能够发出通知,这才是数据绑定的威力。有三种不同的数据更改通知机制: Observable对象,observable字段, 和observable集合.
当这些observable数据对象之一被绑定到UI并且数据对象的属性改变时,UI将被自动更新。
Observable对象
这个就是我在Android数据绑定DataBinding(一)入门篇中最后介绍的那样,将我们的Bean继承 BaseObservable,这里再贴一下code;
public class User extends BaseObservable{
private String userName;
private int age;
public User(String userName, int age) {
this.userName = userName;
this.age = age;
}
@Bindable
public String getUserName() {
return userName == null ? "" : userName;
}
public void setUserName(String userName) {
this.userName = userName;
notifyPropertyChanged(BR.userName);
}
@Bindable
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
notifyPropertyChanged(BR.age);
}
@Override
public String toString() {
return "User{" +
"userName='" + userName + '\'' +
", age=" + age +
'}';
}
}
可以看到在setter方法中调用了notifyPropertyChanged(BR.age);
文档中这样介绍道:The Observable interface has a mechanism to add and remove listeners, but notifying is up to the developer.
也就是说,这种机制允许开发者自己对被监听的字段进行添加和删除,我的理解就是(看你自己想绑定那些字段)。
ObservableFields
相比于上一种方式,使用ObservableFields则可以减少许多的工作量,因为我们可以许多提供的类型,文档介绍如下:ObservableField and its siblings ObservableBoolean, ObservableByte, ObservableChar, ObservableShort, ObservableInt, ObservableLong, ObservableFloat, ObservableDouble, and ObservableParcelable.
示例:
public class People {
public ObservableField<String> name = new ObservableField<>();
public ObservableInt age = new ObservableInt();
public ObservableList<String> list = new ObservableArrayList<>();
public People(String name, int age, ArrayList<String> list) {
this.name = new ObservableField<>(name);
this.age = new ObservableInt(age);
this.list = (ObservableArrayList)list;
}
}
这样就不需要我们自己在getter上设置@binding
,在setter中设置notifyPropertyChanged(int)
了。
Observable 集合
官方列举了这样两个例子,ObservableArrayMap
和ObservableArrayList
,其中对ObservableArrayMap
的介绍是key是String这样的类型时,是非常有用的,示例如下:
ObservableArrayMap<String, Object> user = new ObservableArrayMap<>();
user.put("firstName", "Google");
user.put("lastName", "Inc.");
user.put("age", 17);
在layout中
<data>
<import type="android.databinding.ObservableMap"/>
<variable name="user" type="ObservableMap<String, Object>"/>
</data>
…
<TextView
android:text='@{user["lastName"]}'
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:text='@{String.valueOf(1 + (Integer)user["age"])}'
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
我的理解就是一些集合类型的封装使用。
事件处理(Event Handling)
之前对某个View设置某种监听事件是通过setXXXX,在数据绑定中是如何实现的呢,有两种方式
- 方法引用(Method References)
- 监听器绑定(Listener Bindings)
方法引用(Method References)
其实这种方法在之前也使用过,较多的是button的onClick事件,通常是直接在布局中写上相应Activity中的方法即可,其实这就是方法引用,学习官网的例子,我写的demo示例如下:
- 布局文件中
<variable
name="presenter"
type="com.jiajia.mypractisedemos.module.jetpack.JetpackActivity.Presenter"/>
......
<Button
android:text="click"
android:textAllCaps="false"
android:onClick="@{presenter.onClick}"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
- Activity中
public class Presenter {
public void onClick(View view) {
people.name.set("啊啊啊啊啊");
Toast.makeText(JetpackActivity.this, "点击了Button",Toast.LENGTH_SHORT).show();
}
}
这里注意必须给定参数View view,即需要符合事件监听的写法。
监听器绑定(Listener Bindings)
这个说真的,没特别理解,简单整理一下,英文文档说:在方法引用中,方法的参数必须与事件监听器的参数匹配。在监听器绑定中,只有你的返回值必须与监听器的期望返回值相匹配(除非它预期为void),例如:
public class Presenter {
public void onSaveClick(Task task){}
}
然后,您可以将click事件绑定到您的类,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="task" type="com.android.example.Task" />
<variable name="presenter" type="com.android.example.Presenter" />
</data>
<LinearLayout android:layout_width="match_parent" android:layout_height="match_parent">
<Button android:layout_width="wrap_content" android:layout_height="wrap_content"
android:onClick="@{() -> presenter.onSaveClick(task)}" />
</LinearLayout>
</layout>
注意这里没有传入view参数,可能这就是与方法引用不同之处,当然也可以传啦, android:onClick="@{(view) -> presenter.onSaveClick(task)}"
,还有好几种,也不知道什么情况下用,也不懂,不写了,以后用到再说。我觉得就方法引用的方式用得比较多,比较太low了平时写的代码。
方法引用和监听器绑定的主要区别在于实际的监听器实现是在绑定数据时创建的,而不是在事件触发时创建的。如果您喜欢在事件发生时计算表达式,则应该使用监听器绑定。
最后
下午6点了,好饿,去食堂吃麻辣烫了!
此致,敬礼
Android数据绑定DataBinding(二)入门篇的更多相关文章
- Android数据绑定DataBinding(一)入门篇
早上看到了一篇推文"还在使用繁琐的findViewById,跟着尝试了一下DataBinding,之前使用ButteKnife就已经干掉了findViewById.因为写过微信小程序,那种在 ...
- Android数据绑定技二,企业级开发
PS:上一篇文章写了Databinding的简单使用,写了一个绑定textview的示例,和绑定的一些用法,估计有的人会说,之前的写的好好的,为什么要数据绑定这样的写法呢,没办法,社会在进步,当然是怎 ...
- Android数据绑定技术二,企业级开发
PS:上一篇文章写了Databinding的简单使用,写了一个绑定textview的示例,和绑定的一些用法,估计有的人会说,之前的写的好好的,为什么要数据绑定这样的写法呢,没办法,社会在进步,当然是怎 ...
- 在android 上 使用 rxjava 入门篇
什么是 rxJava? RxJava is a Java VM implementation of Reactive Extensions: a library for composing async ...
- 现代C++学习笔记之二入门篇2,数据转换
static_cast: 这种强制转换只会在编译时检查. 如果编译器检测到您尝试强制转换完全不兼容的类型,则static_cast会返回错误. 您还可以使用它在基类指针和派生类指针之间强制转换, ...
- 现代C++学习笔记之二入门篇1
现代 C++ 强调: 基于堆栈的范围,而非堆或静态全局范围. 自动类型推理,而非显式类型名称. 智能指针而不是原始指针. std::string 和 std::wstring 类型(请参见 <s ...
- Android数据绑定技术一,企业级开发
PS:数据绑定,顾名思义是数据与一些控件或者用户账号等绑定,这样用的好处是便于管理.代码清晰,量少. 首先要了解什么是数据绑定? 为什么要用数据绑定? 怎么用数据绑定? 语法的使用 简单例子,数据绑定 ...
- 【Android开发日记】之入门篇(十二)——Android组件间的数据传输
组件我们有了,那么我们缺少一个组件之间传递信息的渠道.利用Intent做载体,这是一个王道的做法.还有呢,可以利用文件系统来做数据共享.也可以使用Application设置全局数据,利用组件来进行控制 ...
- 【Android开发日记】之入门篇(三)——Android目录结构
本来的话,这一章想要介绍的是Android的系统架构,毕竟有了这些知识的储备,再去看实际的项目时才会更清楚地理解为什么要这样设计,同时在开发中遇到难题,也可以凭借着对Android的了解,尽快找出哪些 ...
随机推荐
- 【日语】日语单词N3_N4_N5
日语单词N3_N4_N5 单 词 讲 解 あ行单词 ああ:0[副]那样.那种 例句:ああ言うことはしないほうがいい.那样的事情最好不做. 電車の窓からごみを棄てているああ言うことはしないほうがいい. ...
- 用BIO手写实现Redis客户端的探究(拒绝Jedis)
在Redis的使用过程中,大多数人都是使用现成的客户端,如Jedis,Redisson,Lettuce.因此本文研究用BIO的方式手写Redis客户端尝试,对遇到的问题进行探究及总结. Redis通讯 ...
- Hystrix原理与实战
Hystrix原理与实战 背景 分布式系统环境下,服务间类似依赖非常常见,一个业务调用通常依赖多个基础服务. 比如:订单服务调用商品服务,商品服务调用库存服务. 对于同步调用,当库存服务不可用时,商品 ...
- Vue组件component创建及使用
组件化与模块化的区别 什么是组件:组件的出现,就是为了拆分Vue实例的代码量,能够让我们以不同的组件,来划分不同的功能模块 ,将来我们需要什么功能,就可以去调用对应的组件即可 组件化与模块化的不同: ...
- 剖析gcc -v输出
分析gcc -v的详细信息的意义 首先我们需要清楚一点,我们并不能完全弄清楚gcc -v的所有信息,因为毕竟我们并不是GCC编译器集合的实现者,对于这些信息,他们才是最清楚的.由于我们不能将所有的信息 ...
- UltraISO 软碟通注册(亲测!!!)
声明:本文仅限学习者共享使用,请勿用来商业行为,否则后果自负!!! 强烈建议!!!支持正版购买通道,请走这里. 免费下载UltralSO软碟通 首先当然是下载安装UltraISO软件,不然怎么** ...
- springboot中的小技巧
1.Thymeleaf 在时使用Thymeleaf的时候不用设置html标签:在默认的Thymeleaf的页面中,对于.html的要求比较严格,少写或者多写标签,都会被报错,而在springboot ...
- Oracle前期工具【1】
目录: 1.oracle下载安装[Oracle11g] 2.Oracle客户端工具下载安装 [sqldeveloper.exe] 3.cmd进入Oracle命令界面操作 4.客户端图形化命令操作 or ...
- charles 右键菜单
本文参考:charles 右键菜单 在网址/域名上右键 可以获得下面菜单 区域 1 基本操作 :基本的URL复制,文件保存,以及选中文件内搜索 区域 2 重写操作 :重写发送请求(调用接口合适),或者 ...
- linux网络编程之socket编程(九)
转眼又快到十一月份了,北京已经是完全进入冬天的节奏,外面冷风嗖嗖的,不过在夜深人静之时,学习永远成了我最快乐的时光,只有此时会觉得自己是如此踏实,虽说白天工作也是编一天程,但是此时的编程,是一种业余爱 ...