Android-DataBind使用

> Android https://developer.android.com/tools/data-binding/guide.html 文档

http://blog.zhaiyifan.cn/2016/06/16/android-new-project-from-0-p7/
https://github.com/LyndonChin/MasteringAndroidDataBinding/blob/master/README.md#rd
https://www.aswifter.com/2015/07/11/android-data-binding-example/ 一个项目地址
学习地址

MVVM

MVC-》MVP-》MVVM 开发模式的转变。

优点
在Android中的体现为,在使用了MVP后 p层拿到数据 调用view层修改界面,或者 数据修改p层通知视图曾作修改,多了一些操作:MVVM 减少了步骤
缺点
耦合性跟高,不利于重构

DataBind

Data Binding,顾名思义,数据绑定,是Google对MVVM在Android上的一种实现,可以直接绑定数据到xml中,并实现自动刷新。

使用

在module 的gradle 做配置,Android的gradle版本不能低于1.5-alpha1

dataBinding {
    enabled true
}

第一步

public class User {
    private final String Name;


    public User(String Name) {
        this.Name= Name;
    }

    public String getName() {
        return Name;
    }
}

在mvp或者mvc中 让textView 显示用户的名字 都要在代码调用,text.setText(user.getName())等操作
在databind的操作下 就少了这步操作

第二步
在xml中配置文件

<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
    data>
    
    <LinearLayout>
    ....
    LinearLayout>
layout>

LinearLayout下面就是一个正常的布局 ,他的根节点不再是,而是变成一个layout,并且增加了data这个结点

使用了DataBind之后 xml的布局不再是单纯展示UI,还要UI元素用变量,data像个搭建view和model之间的关系

第三步
告诉布局 我这个界面 要用到哪个对象或者是元素
在data中的写法

<data>
    "user" type="com.hotel.sf.databinddemo.User" />
data>
或者是,通过import的形式
<data>
    <import type="com.hotel.sf.databinddemo.User" />
    "user" type="User" />
data>

第四步

view和model 绑定

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@{user.name}" />
    或者
    <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@{user.getName()}" />

第五步
DataBindingUtil.setContentView 替代了setConteView
如果在MainActivity中使用在

 ActivityMainBinding  viewDataBinding = DataBindingUtil.setContentView(this,R.layout.activity_main);
   user = new User("xiaoming");
   viewDataBinding.setUser(user);

空指针

textview.settext(null) 获取其他有空指针,在xml也能做相关的逻辑判断(三元运算符)

android:text="@{user.displayName != null ? user.displayName : user.lastName}"
或者
android:text="@{user.displayName ?? user.lastName}"

也可以给view设置属性

"@{user.name}"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:visibility="@{user.isAdult ? View.VISIBLE : View.GONE}"/>

单向绑定

上面的设置,在你代码修改用户属性的时候,view不会自动的做属性上的修改,我们希望用户在修改数据的时候视图层也自动做修改,

要实现 Observable Binding,首先得有一个 implement 了接口 android.databinding.Observable 的类,为了方便,Android 原生提供了已经封装好的一个类 - BaseObservable,并且实现了监听器的注册机制。

public class User extends BaseObservable  {
    private String name;
      public final String defalutName = "我是小名";

    public User(String name) {
        this.name= name;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
        notifyPropertyChanged(com.hotel.sf.databinddemo.BR.firstName);
    }

    @Bindable
    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }
}
这样代码修改用户资料 对象也会被时刻更新

在编译期间,Bindable注解在BR类文件中生成一个Entry。BR类文件会在模块包内生成。如果用于Data类的基类不能改变,Observable接口通过方便的PropertyChangeRegistry来实现用于储存和有效地通知监听器。

如果想节省时间可以使用Observable 字段 要使用这个需要创建public final

public class User extends BaseObservable {
    public final ObservableField name =
            new ObservableField<>();
}
访问字段的方法就会被改为
   user.name.set("小红");
   user.name.get()

你可能感兴趣的:(Android)