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的了解,尽快找出哪些 ...
随机推荐
- K2 BPM_康熙别烦恼(上篇)——分级授权_工作流引擎
- Android NDK 学习之Android.mk
Android.mk file syntax specification Introduction: This document describes the syntax of Android.mk ...
- 【完整篇】orangepi香橙派新手入门之被官方坑
图片特意缩小,看不清请打开另一个窗口查看原图. 第一步:烧录系统,我烧录的是Ubuntu_Desktop[请注意!!!!用户名是错的!!用户名是错的!!用户名是错的!!] 正确的用户名是orangep ...
- ArcCatalog连接数据库报错
ArcCatalog连接数据库报错: Failed to connect to database. Cannot connect to database because the database cl ...
- Git Git 已被其他开发删除的远程分支,本地依旧显示,如何删除?
- Android笔记 (二) Android的核心---Activity
什么是Activity Activity是Android应用程序核心组件中最基本的一个,是用户和程序交互的窗口,一个activity通常对应一个单独的视图,一个APP由一个或者多个activity构成 ...
- Python函数Day6
一.内置函数 list() 将一个可迭代对象转化为列表 字典转为列表:会将所有键转化为列表 字符串转为列表:键每个字符转化为列表 s = 'abc' dic = {'a':1,'b':2,'c':3} ...
- 重新编程Hexiwear Docking Station扩展坞
Hexiwear扩展坞(Docking Station)有一个很不错的功能:它板载了一个调试电路(OpenSDA). 这样我就不需要一个外部调试器来调试Hexiwear. 但是,重新编程扩展坞自身需要 ...
- pandas里面过滤列出现ValueError: cannot index with vector containing NA / NaN values错误的解决方法(转)
###df_18的字段fuek是否包含 / df_18[df_18['fuel'].str.contains('/')] 报错: ValueError Traceback (most recent c ...
- Linux网络编程综合运用之MiniFtp实现(八)
上节中实现了"USER"和"PASS"命令,如下: 事实上FTP是有很多命令组成的,如果就采用上面的这种方法来实现的话,就会有很多if...else if语句, ...