RxJava+RxAndroid로 "A가 ON인 경우 항목 B를 입력해야 함"을 위한Validation

12619 단어 AndroidRxJavaRxAndroid
예를 들어 쇼핑몰이나 발송 목적지를 지정하는 양식인'등록된 주소와 다른 주소로 보내려고 할 때'다른 주소로 보내기'를 확인하면'주소2'는 반드시 입력해야 하는 내용이 되고, 입력하기 전에는 다음 단계를 진행할 수 없다'는 다소 복잡한 Validation은 Reactive Extension의 Java 버전이 된다.RxJava하고 RxAndroid해 봤어요.

동작 이미지


일단 갑자기 동작 결과부터.
  • 주소 1을 입력해야 합니다.
  • 주소 2'주소로 보내기2'를 확인한 경우에만 주소 2를 입력해야 합니다.
  • 필수 항목을 입력하지 않으면 버튼을 누르지 않음
  • 이런 규격입니다.

    이루어지다

    @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
  • OFFtrue로 주소2로 보내면 반환
  • "주소로 보내기2"가 ON이고 "주소2"가 비어 있으면true 반환
  • 을 입력합니다.
    다음으로 구현isValidAll에서 주소 1 및 secondaryIsValid
  • secondaryIsValid인 경우 falsefalse
  • 로 돌아갑니다.
  • secondaryIsValidtrue이고 주소 1이 비어 있지 않으면 되돌아오기
  • 실현
    그리고 이trueisValidAll를 구독하면 subscribe에Validation 결과를 알려주기 때문에 버튼을 바꾸는 onNext입니다.
    conbimeLatest는 본가 RxEnabled라면 chein으로 쓸 수 있지만 RxJava의combineLatest는 왜 static 방법만 있는지 검사할 수 없어서 유감입니다.

    총결산


    이 레벨의 경우 모든 UI 요소에 공통 함수라는 변경 공지가 포함됩니다.
    Observable과combineLatest를 사용하면 제약의 일부분(Observable)을 부분화하여 조합하는 것도 자유롭다(Observable).
    자바라서 코드가 너무 길어서 읽기 힘들어요.
    Xamarin.Android+홈 Reactive Extensions+ReactiveProporty면 상당히 유창하겠네

    좋은 웹페이지 즐겨찾기