RxJava+RxAndroid로 "A가 ON인 경우 항목 B를 입력해야 함"을 위한Validation
동작 이미지
일단 갑자기 동작 결과부터.
이루어지다 @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
// 「注文を確定する」ボタン
final Button buttonSubmit = (Button)findViewById(R.id.buttonSubmit);
// チェックボックスのON/OFFをObservable化
final Observable<Boolean> useSecondaryAddress =
ViewObservable.input((CheckBox) findViewById(R.id.checkUseSecondary), true)
.map(new Func1<OnCheckedChangeEvent, Boolean>() {
@Override
public Boolean call(OnCheckedChangeEvent onCheckedChangeEvent) {
return onCheckedChangeEvent.value;
}
});
// 住所1をObservable化
final Observable<OnTextChangeEvent> primaryAddress =
ViewObservable.text((EditText) findViewById(R.id.editPrimaryAddress), true);
// 住所2をObservable化
final Observable<OnTextChangeEvent> secondaryAddress =
ViewObservable.text((EditText) findViewById(R.id.editSecondaryAddress), true);
// チェックボックスと住所2の必須条件をObservable化
final Observable<Boolean> secondaryIsValid =
Observable.combineLatest(useSecondaryAddress, secondaryAddress,
new Func2<Boolean, OnTextChangeEvent, Boolean>() {
@Override
public Boolean call(Boolean useSecondary, OnTextChangeEvent secondaryAddress) {
if (!useSecondary) {
return true;
}
return !TextUtils.isEmpty(secondaryAddress.text);
}
});
// 全部まとめると、
// 住所1は入力必須、
// 住所2はチェックボックスがONの時だけ入力必須
// 必須条件を満たしていたらtrueを流す
final Observable<Boolean> isValidAll = Observable.combineLatest(primaryAddress, secondaryIsValid,
new Func2<OnTextChangeEvent, Boolean, Boolean>() {
@Override
public Boolean call(OnTextChangeEvent primaryAddress, Boolean isValidSecondary) {
if (!isValidSecondary) {
return false;
}
return !TextUtils.isEmpty(primaryAddress.text);
}
});
// 購読、監視
isValidAll.subscribe(new Observer<Boolean>() {
@Override
public void onNext(final Boolean isValid) {
// 必須条件を満たしていたら「注文を確定する」を有効にする
runOnUiThread(new Runnable() {
@Override
public void run() {
buttonSubmit.setEnabled(isValid);
}
});
}
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
});
}
ViewObservable.xxx
에서 UI 요소 Observable을 변경합니다.이것은 RxAndroid의 기능입니다.이렇게 하면 텍스트를 수정하거나 체크 상자를 변경할 때마다OnNext
가 발생한다.
Validation에서 RxJava로서의 기능Observable.combineLatest
은 키모로 이 녀석에게 두 개의 Observable를 주면 그 중 하나가 변할 때T3 call(T1 a, T2 b)
라고 부른다.T1, T2는 납품된 Observable형이고 T3은 후속 유형이며ValidationBoolean
이기 때문이다.
상기secondaryIsValid
의 실현에서'주소로 보내기2'의 복선상자와'주소2'의 텍스트상자를 전달하는 두 개의 Observable
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
// 「注文を確定する」ボタン
final Button buttonSubmit = (Button)findViewById(R.id.buttonSubmit);
// チェックボックスのON/OFFをObservable化
final Observable<Boolean> useSecondaryAddress =
ViewObservable.input((CheckBox) findViewById(R.id.checkUseSecondary), true)
.map(new Func1<OnCheckedChangeEvent, Boolean>() {
@Override
public Boolean call(OnCheckedChangeEvent onCheckedChangeEvent) {
return onCheckedChangeEvent.value;
}
});
// 住所1をObservable化
final Observable<OnTextChangeEvent> primaryAddress =
ViewObservable.text((EditText) findViewById(R.id.editPrimaryAddress), true);
// 住所2をObservable化
final Observable<OnTextChangeEvent> secondaryAddress =
ViewObservable.text((EditText) findViewById(R.id.editSecondaryAddress), true);
// チェックボックスと住所2の必須条件をObservable化
final Observable<Boolean> secondaryIsValid =
Observable.combineLatest(useSecondaryAddress, secondaryAddress,
new Func2<Boolean, OnTextChangeEvent, Boolean>() {
@Override
public Boolean call(Boolean useSecondary, OnTextChangeEvent secondaryAddress) {
if (!useSecondary) {
return true;
}
return !TextUtils.isEmpty(secondaryAddress.text);
}
});
// 全部まとめると、
// 住所1は入力必須、
// 住所2はチェックボックスがONの時だけ入力必須
// 必須条件を満たしていたらtrueを流す
final Observable<Boolean> isValidAll = Observable.combineLatest(primaryAddress, secondaryIsValid,
new Func2<OnTextChangeEvent, Boolean, Boolean>() {
@Override
public Boolean call(OnTextChangeEvent primaryAddress, Boolean isValidSecondary) {
if (!isValidSecondary) {
return false;
}
return !TextUtils.isEmpty(primaryAddress.text);
}
});
// 購読、監視
isValidAll.subscribe(new Observer<Boolean>() {
@Override
public void onNext(final Boolean isValid) {
// 必須条件を満たしていたら「注文を確定する」を有効にする
runOnUiThread(new Runnable() {
@Override
public void run() {
buttonSubmit.setEnabled(isValid);
}
});
}
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
});
}
true
로 주소2로 보내면 반환true
반환다음으로 구현
isValidAll
에서 주소 1 및 secondaryIsValid
를secondaryIsValid
인 경우 false
false
secondaryIsValid
가 true
이고 주소 1이 비어 있지 않으면 되돌아오기그리고 이
true
isValidAll
를 구독하면 subscribe
에Validation 결과를 알려주기 때문에 버튼을 바꾸는 onNext
입니다.conbimeLatest는 본가 Rx
Enabled
라면 chein으로 쓸 수 있지만 RxJava의combineLatest는 왜 static 방법만 있는지 검사할 수 없어서 유감입니다.총결산
이 레벨의 경우 모든 UI 요소에 공통 함수라는 변경 공지가 포함됩니다.
Observable과combineLatest를 사용하면 제약의 일부분(Observable)을 부분화하여 조합하는 것도 자유롭다(Observable).
자바라서 코드가 너무 길어서 읽기 힘들어요.
Xamarin.Android+홈 Reactive Extensions+ReactiveProporty면 상당히 유창하겠네
Reference
이 문제에 관하여(RxJava+RxAndroid로 "A가 ON인 경우 항목 B를 입력해야 함"을 위한Validation), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/amay077/items/642b41c37f9c889376d8
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(RxJava+RxAndroid로 "A가 ON인 경우 항목 B를 입력해야 함"을 위한Validation), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/amay077/items/642b41c37f9c889376d8텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)