1、需求场景:
需要对多个事件进行联合判断
如:填写表单时,需要表单里所有信息(姓名、年龄、职业等)都被填写后,才允许点击提交按钮。
2、功能说明:
表单里所有信息都被填写后,才允许点击提交。
3、具体实现:
/*
- 步骤2:为每个EditText设置被观察者,用于发送监听事件
- 说明:
- 此处采用了RxBinding:RxTextView.textChanges(name) = 对对控件数据变更进行监听(功能类似TextWatcher),需要引入依赖:compile 'com.jakewharton.rxbinding2:rxbinding:2.0.0'
- 传入EditText控件,点击任1个EditText撰写时,都会发送数据事件 = Function3()的返回值(下面会详细说明)
- 采用skip(1)原因:跳过 一开始EditText无任何输入时的空值
**/
Observable<CharSequence> nameObservable = RxTextView.textChanges(etUsername).skip(1);
Observable<CharSequence> ageObservable = RxTextView.textChanges(etPassword).skip(1);
Observable<CharSequence> jobObservable = RxTextView.textChanges(etPosition).skip(1);
- 采用skip(1)原因:跳过 一开始EditText无任何输入时的空值
/*
- 步骤3:通过combineLatest()合并事件 & 联合判断
**/
Observable.combineLatest(nameObservable,ageObservable,jobObservable,new Function3<CharSequence, CharSequence, CharSequence,Boolean>() {
@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<Boolean>() {
@Override
public void accept(Boolean s) throws Exception {
/*
- 步骤6:返回结果 & 设置按钮可点击样式
**/
Log.e("rxjava", "提交按钮是否可点击: "+s);
btnLogin.setEnabled(s);
}
});