前言
上一篇我們講了如何快速的寫一個MVP去過面試關(guān),未曾想有朋友說能否再來一個MVVM。
那貧僧就緊接著再來一發(fā)吧!
拆分
Model-View-ViewModel
- Model
負(fù)責(zé)數(shù)據(jù) - View
負(fù)責(zé)展示 - ViewModel
負(fù)責(zé)將View和Model關(guān)聯(lián)起來,起到一個中介的作用
廢話不多說,既然速成,代碼走起
我們這里依然遵從MVP速成的思維方式。使用MVP的抽象情景,不過為了更加突出ViewModel的存在意義,我們需要通過view的展示情況來反應(yīng)出ViewModel的作用
那么好,情景是這樣的,按鈕上顯示user的age,用戶點擊按鈕,user的age+1,并且顯示在按鈕上。
- View層
activity_main.layout
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="user" type="org.ding.testmulti.User"/>
</data>
<RelativeLayout
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="org.ding.testmulti.MainActivity">
<Button
android:text="@{user.age}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:id="@+id/button"
android:onClick="click"/>
</RelativeLayout>
</layout>
3步:
* 用一個layout標(biāo)簽包裹原先的布局,并將原先根標(biāo)簽的署名挪到layout標(biāo)簽
* 在layout標(biāo)簽內(nèi)添加data標(biāo)簽,并包裹variable標(biāo)簽,屬性名name表示布局文件中使用的名字,type表示類地址
* 在需要數(shù)據(jù)的地方使用`@{class.property}`的方式來注明使用的具體數(shù)據(jù)。
* Model層
public class User {
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
* ViewModel層
由activity來充當(dāng)
public class MvvmActivity extends AppCompatActivity{
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//系統(tǒng)會根據(jù)你的layout文件名生成相應(yīng)的Binding文件,比如說使用的activity_main,那么就生成ActivityMainBinding文件
//DataBindingUtil是系統(tǒng)提供的bind工具
ActivityMainBinding binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
final User user = new User();
user.setAge(18);
findViewById(R.id.bt_hello).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int age = user.getAge();
user.setAge(age++);
}
});
}
}
其實到以上為止已經(jīng)速成完畢
MVVM略微比MVP簡單一點,主要就是databinding這個東西,只要在布局文件中處理好了,并掌握系統(tǒng)為我們生成的bind工具的使用方法速成就沒有什么問題了。
由于是代碼速成,故而把一些環(huán)境的依賴放在這里:
project的build.gradle文件
dependencies {
classpath 'com.android.tools.build:gradle:2.2.2'
classpath "com.android.databinding:dataBinder:1.0-rc4"
}
module的build.gradle文件
apply plugin: 'com.android.application'
apply plugin: 'com.android.databinding'