DataBinding 使用全面详解
官方文档
Android Data Binding(数据绑定)用户指南 (官方文档中文版)
在xml文件中的写法
绑定
这个时候界面上已经显示出更新的值了
Android Data Binding 系列(一) -- 详细介绍与使用
Databinding 是一个实现数据和UI绑定的框架,是一个实现 MVVM 模式的工具,有了 Data Binding,在Android中也可以很方便的实现MVVM开发模式。
github
侦听器绑定是在事件发生时运行的绑定表达式。它们与方法引用类似,
但它们允许您运行任意数据绑定表达式
。此功能适用于Gradle版本2.0及更高版本的Android Gradle插件。 在方法引用中,方法的参数必须与事件侦听器的
参数相匹配
。在侦听器绑定中,只有您的
返回值
必须与侦听器的预期返回值相匹配(除非它是期望的void)。例如,您可以有一个演示者类具有以下方法:
Android 数据绑定框架DataBinding,堪称解决界面逻辑的黑科技
https://github.com/chiclaim/awesome-android-mvvm
(demo中有一个自定义的加载对话框)
比较全面
目前用的demo
(下方链接)
有demo
Android-MVVM架构-Data Binding的使用
(讲的比较清晰)
讲的很清楚
把值(modelview与xml)关联起来 通过set方法。
赋值也需要进行set方法,这样xml中才能生效
type 属性就是我们在 Java 文件中定义的 类名称。
如果导入相同的类处理方法:
类型别名
如果我们在 data 节点了导入了两个同名的类怎么办?
<
import
type
=
"com.example.home.data.User"
/><
import
type
=
"com.examle.detail.data.User"
/><
variable
name
=
"user"
type
=
"User"
/>
记住一定要设置才能有“相应”
binding
.setBtn(
this
); ()括号中代表当前对象
android
:visibility=
"@{user.isRegister ? View.VISIBLE : View.INVISIBLE}"
user后面跟的是方法名称 isRegister(),其他的也是的
@Bindable 用法,这种方式它会自动找到get方法,来关联起来
@Bindable
public
String getMessageContent() {
return
entity
.getMessageContent();
}
<
TextView
android
:id=
"@+id/right_msg"
android
:layout_width=
"wrap_content"
android
:layout_height=
"wrap_content"
android
:layout_gravity=
"center"
android
:layout_margin=
"10dp"
android
:text=
"@{viewModel.messageContent}"
/>
Observable :
通过继承 BaseObservable 实现相应
set进行更新操作
notifyChange
()或者
notifyPropertyChanged
(
int
fieldId)
get获取最新的值
<
TextView
android
:layout_width=
"wrap_content"
android
:layout_height=
"wrap_content"
android
:text=
"@{user.firstName}"
/>
<
TextView
android
:layout_width=
"wrap_content"
android
:layout_height=
"wrap_content"
android
:text=
"@{user.lastName}"
/>
use.firstName和user.lastName会对应类中(会在xml布局中声明类的全路径com.example.User和变量user)的
get方法
,特别是当set方法进行了更新通知,会进行更新get方法。这个就是 M层发生改变V层就能显示出来的原因,而连接这个的就是databinding
Observable Objects
Observable是提供添加移除监听的一个java接口,DataBinding基于此接口提供了一个基础类BaseObserable,我们可以这样使用它,通过Bindale注解绑定一个getter,当data属性发生改变在setter中发出通知,这样就实现了响应
最新
方法绑定和监听绑定
android:onClick
=
"@{handlers::onClickFriend}"
android:onClick
=
"@{() ->
presenter.onSaveClick(task)}"
最灵活的方式当然是监听绑定,它允许您为事件监听器提供的回调提供不同的参数。
方法binding 默认会有一个参数 (仅在方法binding中)
而监听binding
方法的参数必须和事件监听器参数相匹配,返回值要是一样的类型
这个写的比较好
关于参数
参数有两种选择:要么不写,要么就要写全。
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="@{() -> handler.onTaskClick(task)}" />
或
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="@{(view) -> handler.onTaskClick(task)}"/>
lambda 表达式可添加一个或多个参数,同时参数可任意命名
public class EventHandler {
public void onTaskClickWithParams(View view, Task task) {
task.run();
}
}
让这个表达式生效的办法
public
class
Presenter
{
public
void
onSaveClick
(
View
view
,
Task
task
){}
}
android
:
onClick
=
"@{(theView) -> presenter.onSaveClick(theView, task)}"
自定义BindingAdapter用法:讲的很清楚
https://zhuanlan.zhihu.com/p/20839659