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>
    <!--原先的根节点(Root Element)-->
    <LinearLayout>
    ....
    </LinearLayout>
</layout>

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

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

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

<data>
    <variable name="user" type="com.hotel.sf.databinddemo.User" />
</data>
或者是,通过import的形式
<data>
    <import type="com.hotel.sf.databinddemo.User" />
    <variable name="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设置属性

<TextView
   android:text="@{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<String> name =
            new ObservableField<>();
}
访问字段的方法就会被改为
   user.name.set("小红");
   user.name.get()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值