1. 程式人生 > >Android MVVM databidng 資料雙向繫結與事件繫結

Android MVVM databidng 資料雙向繫結與事件繫結

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類中進行。