前言
在使用了DataBinding之后我们定义事件就和以前不太一样了,这里会变得非常简单.其本质就是设置回调方法,这样就可以在任意类中去实现我们的事件响应了。
事件绑定可用于以下多种回调事件
android:onClick
android:onLongClick
android:afterTextChanged
android:onTextChanged
...
案例
我们直接用android:onClick和android:afterTextChanged举个例子吧
先定义一个专门处理事件的类
package com.shark.hander;
import android.content.Context;
import android.text.Editable;
import android.widget.Toast;
import com.shart.model.ObservableUser;
public class UserHandler {
private Context context;
public UserHandler(Context context) {
this.context = context;
}
public void onClick(ObservableUser user) {
Toast.makeText(context, "name:" + user.getName().get(), Toast.LENGTH_SHORT).show();
}
public void afterUserChanged(Editable s) {
Toast.makeText(context, "age:" + s.toString(), Toast.LENGTH_SHORT).show();
}
}
在布局文件中引入它,并设置对应的事件
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<import type="com.shart.model.ObservableUser" />
<import type="com.shark.hander.UserHandler" />
<variable
name="userInfo"
type="ObservableUser" />
<variable
name="userHandler"
type="UserHandler" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<EditText
android:id="@+id/tv_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="50dp"
android:afterTextChanged="@{userHandler.afterUserChanged}"
android:text="@={userInfo.name}" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="@{()->userHandler.onClick(userInfo)}"
android:text="test"
android:textAllCaps="false" />
</LinearLayout>
</layout>
这里事件的参数一定要对应
android:afterTextChanged有一个默认的Editable参数,所以定义回调方法的时候必须带有这个参数,而这个参数就是文本框的值。
android:onClick使用了Lambda 表达式,这样就可以不遵循默认的方法签名,将userInfo对象直接传回点击方法中。
最后在初始化中将userHandler设置进去
viewDataBinding.setUserHandler(new UserHandler(MainActivity.this));
其他类方法的使用
自定义一个类
package com.shark.utils;
public class StringUtils {
public static String toUpperCase(String str) {
return str.toUpperCase();
}
}
在布局文件中使用improt引入它
<import type="com.shark.hander.UserHandler" />
最后调用
android:text="@{StringUtils.toUpperCase(userInfo.name)}"
最后像String这种lang包下的可以直接调用它的方法,而不用improt引入
尾言
DataBinding的介绍就到这为止了,具体还应该去参考官方文档
https://developer.android.google.cn/topic/libraries/data-binding
网友评论