一、概述
通过一个简单的例子介绍一下DataBinding、LiveData、ViewModel的简单使用
二、ViewModel介绍
如果需要Activity的上下文,就需要继承AndroidViewModel(用这个在绑定的时候也会有区别,下面讲),在构造方法里会获取到上下文。
MyViewModule.java
public class MyViewModule extends AndroidViewModel {
//实现双向绑定 liveData + DataBinding
private MutableLiveData<String> phoneInfo;
private Context mContext;
public MyViewModule(@NonNull Application application) {
super(application);
mContext = application;
}
//初始化LiVeData里的数据
public MutableLiveData<String> getPhoneInfo() {
if(phoneInfo == null){
phoneInfo = new MutableLiveData<>();
phoneInfo.setValue("1");
}
return phoneInfo;
}
//点击事件,让数据拼接个C
public void add(){
phoneInfo.setValue(phoneInfo.getValue()+"c");
}
}
三、DataBinding布局上的绑定
-
layout包裹住布局
-
添加data标签
-
varianle标签里的name是type的别名,用于xml里的调用
-
type是ViewModule的类名
-
@{mv.ViewModule}这个方式进行数据的绑定
-
@{()->mv.add()} 进行方法的绑定
<?xml version="1.0" encoding="utf-8"?>
<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="mv"
type="com.lzl.myapplication2.MyViewModule" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{mv.phoneInfo}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
/>
<Button
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
android:onClick="@{()->mv.add()}"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
四、在MainActivity里进行绑定
-
DataBinging用DataBingUtil进行创建。
-
ViewModel用ViewModelProvider进行创建。
public class MainActivity extends AppCompatActivity {
//dataBinging
private ActivityMainBinding dataBing;
private MyViewModule mMyViewModule;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_main);
dataBing = DataBindingUtil.setContentView(this,R.layout.activity_main);
//viewModel的方式
// mMyViewModule = new ViewModelProvider(this, new ViewModelProvider.NewInstanceFactory()).get(MyViewModule.class);
//androidviewModel用的这个。是为了在里面获得到上下文,所以用的这个。
mMyViewModule = new ViewModelProvider(getViewModelStore(),new ViewModelProvider.AndroidViewModelFactory(getApplication())).get(MyViewModule.class);
//view上数据修改,更新viewModule的绑定
dataBing.setMv(mMyViewModule);
//viewModule的数据修改,更新到view上的绑定。
dataBing.setLifecycleOwner(this);
}
}