MVVM的好處與特性不再過多討論。
使用MVVM也有很多輔助框架,我用的是Activity+javabean+handler的模式,基本上是可以數據雙向綁定與事件綁定的普通需求。
首先在xml佈局文件中添加
<data>
<variable
name="loginHandler"
type="com.webtest.handler.LoginHandler"/>
<variable
name="loginInfo"
type="com.webtest.model.LoginInfo" />
</data>
其中LoginInfo是我們建的一個實體類用於操作數據,LoginHandler則作爲viewModel層進行業務的處理。
在xml中需要綁定數據的地方添加綁定
<EditText
android:id="@+id/login_edit_verification"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="手機號"
android:gravity="center"
android:textColorHint="#7FFFFF"
android:textColor="#FFFFFF"
android:text="@={loginInfo.verification}"/>
注意"@={loginInfo.verification}"要有“=”,如果沒有隻能單向傳遞數據(從UI獲取數據,不能將數據同步更新到UI)有等號纔可以實現雙向綁定。
在需要綁定事件的方添加
<Button
android:id="@+id/login_get_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/get_button"
android:layout_marginTop="6dp"
app:layout_constraintEnd_toEndOf="@+id/login_edit_phontno"
app:layout_constraintTop_toBottomOf="@+id/login_edit_phontno"
android:onClick="@{loginHandler.onClickGet}"/>
xml佈局文件裏需要做的事情就這麼多。然後寫一個javabean類來實現數據綁定
public class LoginInfo extends BaseObservable {
private String phoneno;
private String verification;
public LoginInfo(){
}
public LoginInfo(String phoneno, String verification){
this.phoneno = phoneno;
this.verification = verification;
}
@Bindable
public String getPhoneno() {
return phoneno;
}
public void setPhoneno(String phoneno) {
this.phoneno = phoneno;
notifyPropertyChanged(BR.phoneno);
}
@Bindable
public String getVerification() {
return verification;
}
public void setVerification(String verification) {
this.verification = verification;
notifyPropertyChanged(BR.verification);
}
}
注意:在get方法上添加註解@Bindable,在set方法中添加
notifyPropertyChanged(BR.verification);其中BR有兩個包,import導錯的話會報錯,報錯可以試着換一個BR的包。
然後在Activity的oncreate()方法中添加
ActivityLoginBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_login);
binding.setLoginInfo(loginInfo);
就可以實現雙向綁定了。
其中ActivityLoginBinding是根據R.layout.activity_login自動生成的,如果報錯可以嘗試clean下或者重啓。最好是將activity_login考過去然後將下劃線去掉將首字母改成大寫一般就會提示需要import的包了。
實現事件綁定則是建一個Hanler類,寫上事件的方法就可以進行事件處理了
public void onClickGet(View view){
Toast.makeText(view.getContext(),"給你驗證碼",Toast.LENGTH_SHORT).show()
}
就可以實現事件綁定。
由於我們通常會在Handler類裏進行數據操作,而數據通常是從UI即Activity中獲取,所以要自己在Hanler類中寫個javabean的get和set方法
public LoginInfo getLoginInfo() {
return loginInfo;
}
public void setLoginInfo(LoginInfo loginInfo) {
this.loginInfo = loginInfo;
}
LoginInfo loginInfo;
然後在Activity中調用
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
loginInfo = new LoginInfo();
LoginHandler loginHandler = new LoginHandler();
loginHandler.setLoginInfo(loginInfo);
ActivityLoginBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_login);
binding.setLoginHandler(loginHandler);
binding.setLoginInfo(loginInfo);
}
這樣就是Activity只做UI相關的設置等,所有的業務操作全在Handler類中進行。