Android MVVM databidng 数据双向绑定与事件绑定

本文介绍如何在Android项目中使用MVVM模式实现数据和事件的双向绑定,包括配置数据绑定功能、创建实体类及ViewModel层、实现数据与UI的绑定及事件处理。

MVVM

首先在build.gradle文件的android标签中添加dataBinding.enabled = true

android {
    //允许android使用数据绑定功能
    dataBinding.enabled = true
}

然后布局文件根布局必须是layout

在xml布局文件中添加

<layout xmlns:android="http://schemas.android.com/apk/res/android">//布局文件根布局
    <data>
        <variable
            name="loginHandler"
            type="com.webtest.handler.LoginHandler"/>
        <variable
            name="loginInfo"
            type="com.webtest.model.LoginInfo" />
    </data>
</layout>

其中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类中进行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

break妖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值