最近比较清闲,到网上看了些框架和架构,突然看见MVVM模式。MVVM这中开发模式的优点十分得多,可以实现视图和逻辑代码的解耦,并且Google官方的说法,使用了MVVM的开发模式,还可以提高布局文件的解析速度,本人觉得这是十分重要得,我们在安卓开发中经常需要通过ID来找到控件,让人十分的心烦,于是就有很多人用了注解框架,可是注解框架得效率要低于findViewById,因此,Android中的MVVM也即databinding可以帮助我们彻底解决这个问题。下面我们就来看一看怎么使用这个模式。

一.基本配置

这是我遇到一些问题后总结的一些东西,希望批评指正,创建好一个Android Project之后,在gradle文件中添加如下几行代码,表示开启databinding:

dataBinding{
        enabled true
    }

如果这样不行得话,就需要更新SDK或者修改 Project 的 build.gradle,为 build script 添加一条依赖

classpath 'com.android.databinding:dataBinder:1.0-rc0'

为用到 Data Binding 的模块添加插件,修改对应的 build.gradle

apply plugin: 'com.android.databinding'

如果运行报错,那就再删掉前面两条配置。因为前面两条配置是用来拿到databinding的方法。

就是删掉classpath 'com.android.databinding:dataBinder:1.0-rc0'和

apply plugin: 'com.android.databinding'具体是为什么我也不知道。

二.基本使用方法

1.数据简单的绑定

首先创建一个存储数据得实体类,根据后台或数据需要来建立,再这里我就直接写一个简单得实体类如下:

/**
 * 作者:zyx
 * 时间:2016/12/1 22:51
 * 类功能:
 */

public class User {
    private int age;
    private String userName;
    private String nickName;

    public User(String userName, String nickName, int age) {
        this.age = age;
        this.nickName = nickName;
        this.userName = userName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getNickName() {
        return nickName;
    }

    public void setNickName(String nickName) {
        this.nickName = nickName;
    }
}



然后我们再写一个见面布局,但是和常规得布局不一样,它必须用<layout></layout>作为根节点通过<data>来引入数据源

下面就是我写得一个简单得布局:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>

        <variable name="user" type="com.zyx.hero.entity.User">
    </variable></data>

    <linearlayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">

        <textview android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.username}">

        <textview android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.nickname}">

        <textview android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{String.valueOf(user.age)}">
    </textview></textview></textview></linearlayout>
</layout>

在data中定义的variable节点,name属性表示变量的名称,type表示这个变量的类型,实例就是我们实体类的位置,当然,这里你也可以换一种写法,如下:

<data>

        <import type="com.zyx.hero.entity.User">
        <variable name="user" type="User">
    </variable></import></data>

如果在同一个界面下遇到两个相同类名的实体,那么可以用alias属性来给两个类分别取别名,代码如下:

<data>

        <import type="com.zyx.hero.entity.User" alias="Test">
        <variable name="user" type="Test">
    </variable></import></data>

弄完data节点再看看布局,TextView的text属性直接设置为了@{user.username},这样,该TextView一会直接将User实体类的username属性的值

显示出来,对于显示age的TextView用了String.valueOf是因为TextView并不能直接显示int型数据,所以需要一个简单的转换,我们可以在{}里边进行一些简单的运算

在Activity中我们不能像以前一样用setContentView,因为MVVM中有自己绑定的方法,方法如下:

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

ActivityMainBinding 这个类是由系统自动生成得,不同得布局生成得名字不一样,这里我们用的布局文件名为

activity_main所有生成得是ActivityMainBinding ,如果我们得文件名为main_activity,那么对应得文件名称就是MainActivityBinding。

最后就是数据绑定

@Override  
protected void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);  
    ActivityMainBinding activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);  
    User user = new User("张三丰","潇洒走一回",18);   
    activityMainBinding.setUser(user);  
}

这就是一个简单得MVVM得使用,因为才开始玩儿,所有有些是看了别人的博客得到得启发,这里谢谢一下他们。

后面会持续得玩儿MVVM这种模式,因为我觉得还是挺好玩儿得。