RxJava / RxAndroid的新手,我发现缺乏令人不安的例子。作为一种使用Rx的方法,id喜欢试着让小东西工作。基本上,如果EditText
中输入了文字,则在其下方启用Button
。
我遇到this回答,但作者编辑并没有真正展示如何完全实现这样的事情。
根据我收集的内容,我可以使用RxBindings创建Observable
之类的内容:
Observable<CharSequence> observable = RxTextView.textChanges(mEditText);
据说我现在需要.subcribe()
Observer
来监视observable
的变化,但我不确定如何做到这一点。
另外,如果需要,如何在不使用RxBindings的情况下创建EditTexts Observable?
修改虽然存在Retrolambda,但显示如何在没有lambdas(或两者)的情况下实现此问题的答案会有所帮助。
答案 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)
)。