美文网首页
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