1啊终、需求場景:
需要對多個事件進行聯(lián)合判斷
如:填寫表單時,需要表單里所有信息(姓名傲须、年齡蓝牲、職業(yè)等)都被填寫后,才允許點擊提交按鈕泰讽。
2例衍、功能說明:
表單里所有信息都被填寫后,才允許點擊提交已卸。
3佛玄、具體實現(xiàn):
/*
- 步驟2:為每個EditText設(shè)置被觀察者,用于發(fā)送監(jiān)聽事件
- 說明:
- 此處采用了RxBinding:RxTextView.textChanges(name) = 對對控件數(shù)據(jù)變更進行監(jiān)聽(功能類似TextWatcher)累澡,需要引入依賴:compile 'com.jakewharton.rxbinding2:rxbinding:2.0.0'
- 傳入EditText控件梦抢,點擊任1個EditText撰寫時,都會發(fā)送數(shù)據(jù)事件 = Function3()的返回值(下面會詳細(xì)說明)
- 采用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()合并事件 & 聯(lián)合判斷
**/
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:規(guī)定表單信息輸入不能為空
**/
// 1. 姓名信息
boolean isUserNameValid = !TextUtils.isEmpty(etUsername.getText()) ;
// 除了設(shè)置為空永乌,也可設(shè)置長度限制
// boolean isUserNameValid = !TextUtils.isEmpty(name.getText()) && (name.getText().toString().length() > 2 && name.getText().toString().length() < 9);
// 2. 年齡信息
boolean isUserAgeValid = !TextUtils.isEmpty(etPassword.getText());
// 3. 職業(yè)信息
boolean isUserJobValid = !TextUtils.isEmpty(etPosition.getText()) ;
/*
- 步驟5:返回信息 = 聯(lián)合判斷惑申,即3個信息同時已填寫具伍,"提交按鈕"才可點擊
**/
return isUserNameValid && isUserAgeValid && isUserJobValid;
}
}).subscribe(new Consumer<Boolean>() {
@Override
public void accept(Boolean s) throws Exception {
/*
- 步驟6:返回結(jié)果 & 設(shè)置按鈕可點擊樣式
**/
Log.e("rxjava", "提交按鈕是否可點擊: "+s);
btnLogin.setEnabled(s);
}
});