如何使用RxJava + RxAndroid WidgetObservable格式化文本

时间:2016-10-17 23:44:24

标签: android rx-java rx-android

我有一个edittext用户输入一些金额,我有一个默认禁用的继续按钮,只有在金额有效且在某个范围内时才启用,一切正常,直到我尝试将金额格式化为$ 2000或$ 10,000。以下是我在编辑文本中使用WidgetObservable的方法。

Observable<Boolean> amountValidObervable = WidgetObservable.text(amount, false)
            .debounce(500,TimeUnit.MILLISECONDS)
            .observeOn(AndroidSchedulers.mainThread())
            .map(new Func1<OnTextChangeEvent, Boolean>() {
                @Override
                public Boolean call(OnTextChangeEvent event) {
                    CharSequence amount = event.text();
                    return isValid(amount);
                }
            });

formChangeSubscription = amountValidObservable.subscribe(new Action1<Boolean>() {
            @Override
            public void call(Boolean isValid) {
                amountLayout.setErrorEnabled(isValid ? false : true);
                amountLayout.setError(isValid ? null : "Please enter amount within the range");
            }
        });

        amountValidObservable.subscribe(new Subscriber<Boolean>() {
            @Override
            public void onCompleted() {
                log.debug("formChangeObservable completed");
            }

            @Override
            public void onError(Throwable e) {
                log.debug("formChangeObservable error!");
            }

            @Override
            public void onNext(Boolean formValid) {
                           nextBtn.setBackgroundResource(R.drawable.btn);
                nextBtn.setEnabled(formValid);
            }
        });

我想使用类似

之类的格式来编辑编辑文本的文本
DecimalFormat decimalFormat = new DecimalFormat("$#,###");

如何在用户输入时使用此格式化程序使用RxJava格式化文本。请注意,由于某些依赖性,我还不能使用RxBindings。

1 个答案:

答案 0 :(得分:0)

你有1个Observable订阅者的问题,所以refCunt它会很好!只需在.replay(1).refCount()末尾添加amountValidObervable即可:

WidgetObservable.text(amount, false)
        .debounce(500,TimeUnit.MILLISECONDS)
        .observeOn(AndroidSchedulers.mainThread())
        .map(new Func1<OnTextChangeEvent, Boolean>() {
            @Override
            public Boolean call(OnTextChangeEvent event) {
                CharSequence amount = event.text();
                return isValid(amount);
            }
        })
        .replay(1)
        .refCount();