MVVM-DataBinding使用总结



MVVM-DataBinding使用总结

前言

2015年谷歌I/O大会上介绍了一个框架DataBinding,DataBinding是一个数据绑定框架,以前我们在Activity里写很多的findViewById,现在如果我们使用DataBinding,就可以抛弃findViewById。DataBinding主要解决了两个问题:
- 需要多次使用findViewById,损害了应用性能且令人厌烦
- 更新UI数据需切换至UI线程,将数据分解映射到各个view比较麻烦

本文参考网站:

Data Binding Library - Android Developers 谷歌官方

一起跟随谷歌官方的文档资料,一步步学习DataBinding的使用吧!

一、环境构建

Use the following code snippet to configure data binding:
If you have an app module that depends on a library which uses data binding, your app module must configure data binding in its build.gradle file as well.

在你要使用DataBinding的Moudle的build.gradle中添加如下代码进行配置:

android {
    ....
    dataBinding {
        enabled = true
    }
}
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Also, make sure you are using a compatible version of Android Studio. Android Studio 1.3 and later provides support for data binding as described in Android Studio Support for Data Binding.

此外,谷歌官方指定DataBinding只支持AndroidStudio1.3以上的版本。

二、布局文件配置

<?xml version="1.0" encoding="utf-8"?>
<!--布局以layout作为根布局-->
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- data标签 -->
     <data>
        <variable
            name="presenter"
            type="com.mei_husky.samplemvvm.view.MainActivity.Presenter" />
    </data>

   <!--我们需要展示的布局-->
     <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context="com.mei_husky.samplemvvm.view.MainActivity">

        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textAllCaps="false"
            android:onClick="@{() -> presenter.baseDataBinding()}"
            android:text="@{`DataBinding基础使用` + presenter.message}" />
    </LinearLayout>

</layout>
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

可以看到和传统的不同,我们在根布局的外面又嵌套了一层「 layout 」标签,同时我们把原根布局的xmlns命名空间放入了layout标签中。

三、MainActivity代码:

public class MainActivity extends AppCompatActivity {

    public Presenter presenter;

    private ActivityMainBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        inject(); //初始化DataBinding
    }

    private void inject() {
        //现在我们通过DataBindingUtil设置布局文件
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main);

        //初始化Presenter对象
        presenter = new Presenter();
        //将presenter对象赋予XML中的 data -> variable -> presenter
        binding.setPresenter(presenter);
    }

    public class Presenter {

        public String message = " ~ ";

        public void baseDataBinding() {
            startActivity(new Intent(MainActivity.this,DataBindingBaseActivity.class));
        }
    }
}

  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

代码中解释的比较清楚了,我再啰嗦几句:

1.设定这样一种需求:

用户点击Button,跳转页面到下一个Activity,正常我们实现的方式是:给Button设置一个id,然后通过findViewById在Activity中初始化Button,并设置Button的点击事件实现跳转。

现在通过DataBinding,将Button的点击事件和xml中「variable」标签下「presenter」进行绑定,当被点击时,执行presenter.baseDataBinding()方法

 //{}中的语法为lambda表达式,如果没接触过的同学建议花一点时间学习一下,实在太好用了,你一定会爱上它
 android:onClick="@{() -> presenter.baseDataBinding()}"
  
  
  • 1
  • 2

那么如何确认presenter是什么?只需要在MainActivity中将presenter初始化,然后赋予「variable」的标签下「presenter」即可。

于是需要这几行代码:

 //现在通过DataBindingUtil设置布局文件,代替setContentView()
 ActivityMainBinding  binding = DataBindingUtil.setContentView(this, R.layout.activity_main);

 //初始化Presenter对象
 presenter = new Presenter();

 //将presenter对象赋予XML中的 data -> variable -> presenter
 binding.setPresenter(presenter);
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

我们不需要setContentView(),取而代之使用DataBindingUtil.setContentView(),返回的ActivityMainBinding这个类不需要我们创建,DataBinding这个库自动帮我们创建,命名规则就是layout文件首字母大写+Binding

R.layout.activity_main -> ActivityMainBinding

之后通过binding.setPresenter(presenter),将presenter对象赋予「variable」标签下的「presenter」

于是实现了:点击Button,Button会自动执行presenter.baseDataBinding()的方法,跳转到下一个Activity中。

2同理,如果我们想绑定Button的text内容:

展示内容为”DataBinding基础使用”+presenter的String类型成员变量message,正常需要的是在代码中实现button.setText(“DataBinding基础使用”+presenter.message);

现在在将presenter初始化并在Activity中通过set绑定后,直接使用

android:text=”@{DataBinding基础使用 + presenter.message}”

小结

本篇通过简单的小例子,对DataBinding有了一个基本的认识和配置使用,但他的优势绝不仅仅只有减少了findViewById的操作,接下来会在接下来的文章中进行更深入的学习DataBinding其他更优秀的特性。

参考网站:

Data Binding Library - Android Developers 谷歌官方文档(请自备梯子)

DataBindingGuidegoogle官方文档翻译(上)

DataBindingGuidegoogle官方文档翻译(下)



MVVM-DataBinding使用总结

猜你喜欢

转载自blog.csdn.net/u010520146/article/details/81380688