美文网首页
Android DataBinding(三) 之 事件绑定

Android DataBinding(三) 之 事件绑定

作者: Sharkchilli | 来源:发表于2020-12-25 18:29 被阅读0次

前言

在使用了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

参考

Android DataBinding 从入门到进阶

相关文章

网友评论

      本文标题:Android DataBinding(三) 之 事件绑定

      本文链接:https://www.haomeiwen.com/subject/dofpnktx.html