Android---DataBinding

根据前面LiveData,这次将用DataBinding进行代码的一大步缩减。

首先要使用DataBinding,要在gradle里面添加以下字段。
在这里插入图片描述

之后再布局文件中可以看到有个小灯泡,点击第一个:
在这里插入图片描述
之后会自动为你添加一个<layout><data>


之后在相应的activity里,创建ActivityMyDataBindingBinding类对象:

注意下面的类名取决于你对应的layout文件名字是什么!!!!!
例如:layout类名为abc.xml。则类名为:AbcBinding。

private ActivityMyDataBindingBinding bindingBinding;

此对象替换原本的setContentView

bindingBinding= DataBindingUtil.setContentView(this, R.layout.activity_my_data_binding);

之后就可以通过此对象直接调用布局文件的View对象,不用实例化!!!也可以直接设置button的点击(下面就不写例子了)。
例如:

bindingBinding.tvMain.setText("abc");

前面有说到,自动创建了一个<data>它的作用就等同于绑定一个ViewModel。name代表它的别名。到时候在java文件需要用到!!!


    <data>
        <variable
            name="data"
            type="com.example.mydatabinding.MyViewModel" />
    </data>

直接上完整的代码:

xml:
TextView和Button的某属性就可以直接对应ViewModel中的某值,某方法。

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>
        <variable
            name="data"
            type="com.example.mydatabinding.MyViewModel" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/tv_main"
            android:text="@{String.valueOf(data.liveDataNumber)}"/>

        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/btn_one"
            android:text="+1"
            android:onClick="@{()->data.addNumber(1)}"/>

        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/btn_two"
            android:text="+2"
            android:onClick="@{()->data.addNumber(2)}"/>

    </LinearLayout>
</layout>

对应java文件(相关说明都在注释里面):

    private MyViewModel viewModel;
    private ActivityMyDataBindingBinding bindingBinding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        bindingBinding= DataBindingUtil.setContentView(this, R.layout.activity_my_data_binding);
        viewModel=new ViewModelProvider(this).get(MyViewModel.class);
        bindingBinding.setData(viewModel);//.setXxx(yyy)。Xxx表示在布局文件data标签的name
        bindingBinding.setLifecycleOwner(this);//如果没有这行,数据的改变不会被观察到
    }

ViewModel:

public class MyViewModel extends ViewModel {

    private MutableLiveData<Integer> liveDataNumber;

    public MutableLiveData<Integer> getLiveDataNumber() {
        if(liveDataNumber==null){//这里代替了空参的构造方法
            liveDataNumber=new MediatorLiveData<>();
            liveDataNumber.setValue(0);
        }
        return liveDataNumber;
    }
    public void addNumber(int n){
        liveDataNumber.setValue(liveDataNumber.getValue()+n);
    }
}
原创文章 158 获赞 2 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43616001/article/details/105898418