根据前面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);
}
}