RxJava实际应用:联合判断多个事件

1、需求场景:
需要对多个事件进行联合判断
如:填写表单时,需要表单里所有信息(姓名、年龄、职业等)都被填写后,才允许点击提交按钮。

2、功能说明:
表单里所有信息都被填写后,才允许点击提交。

3、具体实现:
/*

  • 步骤2:为每个EditText设置被观察者,用于发送监听事件
  • 说明:
    1. 此处采用了RxBinding:RxTextView.textChanges(name) = 对对控件数据变更进行监听(功能类似TextWatcher),需要引入依赖:compile 'com.jakewharton.rxbinding2:rxbinding:2.0.0'
    1. 传入EditText控件,点击任1个EditText撰写时,都会发送数据事件 = Function3()的返回值(下面会详细说明)
    1. 采用skip(1)原因:跳过 一开始EditText无任何输入时的空值
      **/
      Observable nameObservable = RxTextView.textChanges(etUsername).skip(1);
      Observable ageObservable = RxTextView.textChanges(etPassword).skip(1);
      Observable jobObservable = RxTextView.textChanges(etPosition).skip(1);

/*

  • 步骤3:通过combineLatest()合并事件 & 联合判断
    **/
    Observable.combineLatest(nameObservable,ageObservable,jobObservable,new Function3() {
    @Override
    public Boolean apply(@NonNull CharSequence charSequence, @NonNull CharSequence charSequence2, @NonNull CharSequence charSequence3) throws Exception {

/*

  • 步骤4:规定表单信息输入不能为空
    **/
    // 1. 姓名信息
    boolean isUserNameValid = !TextUtils.isEmpty(etUsername.getText()) ;
    // 除了设置为空,也可设置长度限制
    // boolean isUserNameValid = !TextUtils.isEmpty(name.getText()) && (name.getText().toString().length() > 2 && name.getText().toString().length() < 9);

// 2. 年龄信息
boolean isUserAgeValid = !TextUtils.isEmpty(etPassword.getText());
// 3. 职业信息
boolean isUserJobValid = !TextUtils.isEmpty(etPosition.getText()) ;

/*

  • 步骤5:返回信息 = 联合判断,即3个信息同时已填写,"提交按钮"才可点击
    **/
    return isUserNameValid && isUserAgeValid && isUserJobValid;
    }

}).subscribe(new Consumer() {
@Override
public void accept(Boolean s) throws Exception {
/*

  • 步骤6:返回结果 & 设置按钮可点击样式
    **/
    Log.e("rxjava", "提交按钮是否可点击: "+s);
    btnLogin.setEnabled(s);
    }
    });

你可能感兴趣的:(RxJava实际应用:联合判断多个事件)