Android MVVM databidng 數據雙向綁定與事件綁定

MVVMhtml

首先在xml佈局文件中添加java

<data>
    <variable
        name="loginHandler"
        type="com.webtest.handler.LoginHandler"/>
    <variable
        name="loginInfo"
        type="com.webtest.model.LoginInfo" />
</data>

其中LoginInfo是咱們建的一個實體類用於操做數據,LoginHandler則做爲viewModel層進行業務的處理。android

在xml中須要綁定數據的地方添加綁定web

<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)有等號才能夠實現雙向綁定。app

在須要綁定事件的方添加佈局

<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類來實現數據綁定this

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方法中添加spa

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的包了。code

實現事件綁定則是建一個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類中進行。