Android DataBinding介绍(一)——简介、数据及方法事件绑定

简介

Data binding 是Google在2015年7月发布的Android Studio v1.3.0 版本上引入的,在2016年4月Android Studio v2.0.0 上正式支持。引入之初,不支持双向绑定,目前已经支持了。
DataBinding 是基于MVVM思想实现数据和UI绑定的的框架,有了 Data Binding,在Android中也可以很方便的实现MVVM。
在引入DataBinding之前,我们需要敲很多很鸡肋的代码,如 findViewById()、setText(),setVisibility(),setEnabled() 或 setOnClickListener() 等,通过 Data Binding , 我们可以通过声明式布局以精简的代码来绑定应用程序逻辑和布局,这样就不用编写大量的毫无营养的代码了。
DataBinding 是一个support库,最低支持到Android 2.1(API Level 7+)

环境构建

1、先下载最新的 Support repository和Google Repository,如果在引入过程中报如下错误,一把就是由于没有升级前两个库造成的

2、在Module的build.gradle文件中的android节点下做如下配置:


3、要求
Android Plugin for Gradle: 1.5.0-alpha1及以上
Android Studio 1.3
及以上

具体使用方式

简单数据绑定

1、布局文件将更节点变为layout节点并引入data节点,同时创建好需要用到的Model
<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools">

    <data>
        <variable
            name="user"
            type="com.victor.databinding.User"/>
    </data>
public class User {

    public String firstName;
    public String lastName;
    public String phone; // 电话
    public boolean isShowPhone;

    /**
     * 获取全名
     * @param firstName
     * @param lastName
     * @return
     */
    public String getFullName(String firstName, String lastName) {
        StringBuilder sb = new StringBuilder();
        sb.append("全名:");
        if (!TextUtils.isEmpty(firstName)) {
            sb.append(firstName);
        }
        if (!TextUtils.isEmpty(lastName)) {
            sb.append("." + lastName);
        }
        return sb.toString();
    }
}

其中data节点下一个variable节点代表一个变量,name属性根据需要自己取名,type为需要用到的Model的全路径,功能相当于写代码的时候引入一个类的功能

2、在Activity中,用 DataBindingUtil.setContentView(Activity activity, int layoutId)代替setContentView(int layoutId),同时初始化数据,并进行绑定
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 要用setContentView(Activity activity, int layoutId)代替该方法
        //setContentView(R.layout.activity_main);

        ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);

        // 初始化数据
        User user = new User();
        user.firstName = "Victor";
        user.lastName = "Fang";
        user.phone = "13333333333";
        user.isShowPhone = false;
        // 绑定数据
        binding.setUser(user);
}
其中ActivityMainBinding是根据你绑定的布局文件的名称去掉下划线后加上Binding,由系统自动生成。

3、在布局文件中使用数据绑定
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content
    android:text="@{user.firstName}"/>
其中user就是你第一步定义data节点下的变量(variable)中name属性值。firstName是Model中的变量名
将app跑起来就能看到TextView已经能展示数据了


三元表达式

DataBinding还支持三元表达式功能,如在布局文件中添加如下节点
但是需要注意的是:引用了API原有的类,如View,是需要通过import节点导入的,不然会报错
<data>
        <!--<import type="com.victor.databinding.User"/>-->
        <import type="android.view.View"/>


<!-- 三元表达式 -->
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.phone}"
            android:visibility="@{user.isShowPhone ? View.VISIBLE : View.GONE}"/>
一开始我们初始user的时候,isShowPhone = false,所以不会看到有电话号码显示(下左图),如果我们将isShowPhone改为true,显示如下右图


方法事件绑定

DataBinding除了支持数据绑定外,还可以绑定方法和监听事件

普通方法的绑定,直接在布局文件中,通过变量名调用方法即可,和java代码里面使用相似
<!--类方法的绑定-->
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.getFullName(user.firstName, user.lastName)}"/> <!--调用User类里面的获取全名的方法-->
显示效果:


事件绑定
类似于 android:onClick 可以指定 Activity 中的函数,Data Binding 也允许处理从视图中发送的事件。两种实现方式:
方法调用监听绑定
二者主要区别在于方法调用在编译时处理,而监听绑定于事件发生时处理。
方法调用
<!--事件绑定-->
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="ShowToast"
            android:onClick="@{handler::showTost}"/>
其中用的handler类创建后也许通过data节点下引入
public class MyHandler {

    public void showTost(View view) {
        Toast.makeText(view.getContext(), "展示吐司", Toast.LENGTH_SHORT).show();
    }

    public void onEventListenerExecute(MyTask task) {
        task.run();
    }

}


 <variable
            name="handler"
            type="com.victor.databinding.MyHandler"/>
这样不用再代码里面写任何事件监听的代码,就能够相应按钮的点击事件
监听绑定
需要注意的是:此功能在 Android Gradle Plugin version 2.0 或更新版本上可用,支持lambda表达式
在方法引用中,方法的参数必须与监听器对象的参数相匹配。
在监听绑定中,只要返回值与监听器对象的预期返回值相匹配即可
布局文件
<!-- 监听绑定 使用lambda表达式 -->
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="runTask"
            android:onClick="@{() -> handler.onEventListenerExecute(task)}"/>
Task类如下
public class MyTask implements Runnable {

    private Context mContext;

    public MyTask(Context context) {
        mContext = context;
    }

    @Override
    public void run() {
        Toast.makeText(mContext, "执行任务", Toast.LENGTH_SHORT).show();
    }
}
展示效果:
发布了30 篇原创文章 · 获赞 10 · 访问量 4万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览