Android MVVM databidng 資料雙向繫結與事件繫結
阿新 • • 發佈:2019-01-08
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類中進行。