EditText有文本时启用按钮(RxAndroid)

时间:2015-12-23 08:27:43

标签: android rx-java rx-android

RxJava / RxAndroid的新手,我发现缺乏令人不安的例子。作为一种使用Rx的方法,id喜欢试着让小东西工作。基本上,如果EditText中输入了文字,则在其下方启用Button

我遇到this回答,但作者编辑并没有真正展示如何完全实现这样的事情。

根据我收集的内容,我可以使用RxBindings创建Observable之类的内容:

Observable<CharSequence> observable = RxTextView.textChanges(mEditText);

据说我现在需要.subcribe() Observer来监视observable的变化,但我不确定如何做到这一点。

另外,如果需要,如何在不使用RxBindings的情况下创建EditTexts Observable?

修改虽然存在Retrolambda,但显示如何在没有lambdas(或两者)的情况下实现此问题的答案会有所帮助。

2 个答案:

答案 0 :(得分:8)

Observable<CharSequence> observable = RxTextView.textChanges(mEditText);
    observable.map(new Func1<CharSequence, Boolean>() {
        @Override
        public Boolean call(CharSequence charSequence) {
            return charSequence.length() > 0;
        }
    }).subscribe(new Subscriber<Boolean>() {
        @Override
        public void onCompleted() {

        }

        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void onNext(Boolean aBoolean) {
             mButton.setEnabled(aBoolean);
        }
    });

请勿忘记保留对订阅的引用,并在不再需要时取消订阅(例如onDestroy)。

RxJava-Android-Samples包含适用于Android的RxJava示例。看看这个。您可能想查看Form Validation example

  

另外,如何在不使用的情况下创建EditTexts Observable   如果需要,RxBindings?

您可以查看实施情况。它是开源的。在内部,它使用TextWatcher来监控更改,并在文本更改时发出项目。

答案 1 :(得分:5)

要订阅Observable<CharSequence>,您可以执行以下操作。

Observable<CharSequence> observable = RxTextView.textChanges(mEditText).skip(1);
mButton.setEnabled(false)
observable.subscribe(mButton -> mButton.setEnabled(true));

如果您未使用retrolambda,则可以执行以下操作:

Observable<CharSequence> observable = RxTextView.textChanges(mEditText).skip(1);
mButton.setEnabled(false);
observable.subscribe(new Action1<CharSequence>(){

    @Override
    public void call(CharSequence c) {
        mButton.setEnabled(true);
    }

});

关于你问题的第二部分:说实话,我不确定,但我猜你会在TextWatcher上添加EditText并每次发起一次事件文本更改(using Observable.just(charSequenceAfterEdit))。