Jetpack -- DataBinding

2020-02-28  本文已影响0人  Anwfly

一.概述
2015年Google推出一个数据绑定框架DataBinding,以前都是结合MVVM使用的,2018年被Google入列到Jetpack的架构中,配合LiveData、ViewModel使用简直完美。
DataBinding是以声明的方式将可观察的数据绑定到界面元素。
简言之,Controller和View层彻底解耦,靠DataBinding实现数据绑定。


image.png

二.特点

  1. 优点
    ①moudle与ViewD的几乎完全解耦;
    ②节省大量代码,如findViewById,adapter,setOnClick()....
    ③布局的性能优于findviewbyId
    ④结合AAC(Android Architecture Components)对app的生命周期的一系列操作更加便捷

2.缺点
①xml的赋值方法比较奇怪,杜宇没有掌握DataBinding的开发者代码阅读起来会很头疼,代码量大的时候会显得很混乱;
②出现问题不是很好定位(比如说偶尔的xml忘记导包,导致编译错误等等)

三.使用
先看效果图,点踩减一,点赞加一:


screen1.png

1.使用ViewModel存放界面数据

public class AnflyViewModel extends ViewModel {
    private MutableLiveData<Integer> number;

    public MutableLiveData<Integer> getNumber() {
        if (number == null) {
            number = new MutableLiveData<>();
            //默认为0
            number.setValue(0);
        }
        return number;
    }

    /**
     * 功能为自身加一
     */
    public void like() {
        number.setValue(number.getValue() + 1);
    }

    /**
     * 功能为自身减一
     */
    public void disLike() {
        number.setValue(number.getValue() - 1);
    }
}

2.在gradle中添加DataBinding允许

defaultConfig {
      ....
      dataBinding {
            enabled = true
        }
    }

3.具体使用DataBinding
①在主界面布局左上角,有一个灯泡,点击


1582902943(1).png

②选中“Convert to data bindind layout”


1582903164(1).png
点击后,Acitivity或者fragment的布局最外层嵌套一层layout,并且多了一对标签data
现在布局就可以像代码一样操作了
③在Mainactivity修改
public class MainActivity extends AppCompatActivity {

    private AnflyViewModel anflyViewModel;
    private ActivityMainBinding dataBinding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //1.注释掉以前的setContentView,使用DataBindingUtil.setContentView()加载布局,返回ActivityMainBinding
        //他是layout的绑定类,layout中的控件都是他的成员,可以直接调用
        //setContentView(R.layout.activity_main);
        dataBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        //获取Viewmodel
        anflyViewModel = ViewModelProviders.of(this).get(AnflyViewModel.class);
        //给layout反向绑定数据的时候需要设置数据持有者
        dataBinding.setData(anflyViewModel);
        //设置布局绑定类生命周期的拥有者
        dataBinding.setLifecycleOwner(this);
    }
}

④layout可以反向绑定数据:
android:text="@{String.valueOf(data.number)}",
android:onClick="@{()->data.disLike()}"

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
    <data>
        //这个就像他的字面意思,变量,variable是你为这个xml定义的一个个变量.如下,你需要给它起一个名字name,
        然后你需要为他指定一个type,这个type可以使你上面导包的类名,也可以是一个类的全类名,也可是是你导包
        时候设置的别名,variable支持后多类型,比如String,int.....
        <variable
            name="data"
            type="com.anfly.databinding.AnflyViewModel" />
    </data>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <TextView
            android:id="@+id/tv_number"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="100dp"
            android:text="@{String.valueOf(data.number)}"
            android:textColor="@color/colorAccent"
            android:textSize="50sp" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/tv_number"
            android:layout_marginTop="150dp"
            android:gravity="center_horizontal">

            <ImageView
                android:id="@+id/iv_dislike"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="@{()->data.disLike()}"
                android:src="@drawable/ic_thumb_down_black_24dp" />

            <ImageView
                android:id="@+id/iv_like"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="100dp"
                android:onClick="@{()->data.like()}"
                android:src="@drawable/ic_thumb_up_black_24dp" />

        </LinearLayout>
    </RelativeLayout>
</layout>

使用DataBinding实现RecycleerView列表

上一篇下一篇

猜你喜欢

热点阅读