我们为什么要使用这种方式进行代码的开发
传统的方式:
1.违背单一原则,(职责过多)
2.代码臃肿,不便于管理
3.非常的依赖activiry或者Fragment
...
jetpck方式:
1.体现单一原则
2.分层清晰
3.解耦,降低对activiry或者Fragment的依赖
...
先看下展示的效果
保证activiry的单一职责原则,只进行管理和绑定的工作,我们不在activiry中进行过多的逻辑的操作,我们将数据的操作放到viewmodle中进行操作
MainViewModle
//感应数据的变化
private MutableLiveData<String> phoneInfo;//展示手机号
private MutableLiveData<Boolean> isShow;//设置键盘的展示和隐藏
public MutableLiveData<String> getPhoneInfo() {
if (phoneInfo == null) {
phoneInfo = new MutableLiveData<>();
phoneInfo.setValue("");//设置默认值
}
return phoneInfo;
}
....自己的其他的逻辑
....
/**
* 输入
*/
public void InPutNumber(String number) {
phoneInfo.setValue(phoneInfo.getValue() + number);
}
如果我们的的viewmodle需要获取环境的做操作的时候需要继承AndroidViewModel这样就能获取到了上下文的环境
public MainViewModle(@NonNull Application application) {
super(application);
this.context = application;
}
我们将布局交给databingding进行管理,首先开启modul开启databingding
android {
.....
//这样开启引用也可以dataBinding.enabled = true
dataBinding{
enabled = true
}
}
首先我们要将布局全部都交给databingding进行管理
<?xml version="1.0" encoding="utf-8"?>
//layout 不是布局,是databingding所有的,用于将整个布局交给databingding进行管理
<layout xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="vm"
type="com.lnh.jetpackmvvm.MainViewModle" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@mipmap/beijing"
android:orientation="vertical"
tools:context=".MainActivity">
.....
//你自己的逻辑
.....
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:text="@{vm.phoneInfo}"
android:textColor="#333333"
android:textSize="32sp" />
.....
//你自己的逻辑
.....
<Button
android:id="@+id/bt_number4"
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_weight="1"
android:background="@drawable/key_background"
android:onClick="@{()->vm.InPutNumber(@string/number4)}"
android:text="4"
android:textColor="#ffffff"
android:textSize="22sp" />
.....
//你自己的逻辑
.....
</LinearLayout>
</layout>
注意要添加否则找不到指向
<data>
<variable
name="vm"
type="com.lnh.jetpackmvvm.MainViewModle" />
</data>
布局交由了databinding进行管理了,数据的操作的逻辑也全部交给了viewmodle进行了操作,那我们如何进行关联让他们进行双向驱动展示呢
1.我们要在view中找到我们做需要的管理
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
2.引用到我们数据的viewmodle
MainViewModle mainViewModle = new ViewModelProvider(this, new ViewModelProvider.AndroidViewModelFactory(getApplication())).get(MainViewModle.class);
3.建立联系和感应
binding.setVm(mainViewModle);
//建立感应
binding.setLifecycleOwner(this);