首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编辑文本上带有setText的setText

编辑文本上带有setText的setText
EN

Stack Overflow用户
提问于 2018-06-11 12:27:56
回答 2查看 6K关注 0票数 4
代码语言:javascript
复制
RxTextView.textChanges(editText)
                .map(CharSequence::toString)
                .debounce(200, TimeUnit.MILLISECONDS)
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(input -> {
                   output = //...do something with input
                   editText.setText(ouput)
                 }));

当我setText(output)时,它是循环的。要设置文本,我首先需要删除侦听器,然后再设置侦听器。我如何使用RxJava来完成这个任务?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-15 20:29:29

当我setText(output)时,它是循环的。要设置文本,我首先需要删除侦听器,然后再设置侦听器。我如何使用RxJava来完成这个任务呢?

为了满足这一需求,我设法扩展了RxBinding源代码,如下所示。

EditableTextViewTextObservable.java

代码语言:javascript
复制
public class EditableTextViewTextObservable extends InitialValueObservable<CharSequence> {
    private final TextView view;

    EditableTextViewTextObservable(TextView view) {
        this.view = view;
    }

    @Override
    protected void subscribeListener(Observer<? super CharSequence> observer) {
        EditableTextViewTextObservable.Listener listener = new EditableTextViewTextObservable.Listener(view, observer);
        observer.onSubscribe(listener);
        view.addTextChangedListener(listener);
    }

    @Override protected CharSequence getInitialValue() {
        return view.getText();
    }

    final static class Listener extends MainThreadDisposable implements TextWatcher {
        private final TextView view;
        private final Observer<? super CharSequence> observer;

        Listener(TextView view, Observer<? super CharSequence> observer) {
            this.view = view;
            this.observer = observer;
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
        }

        @Override
        public void afterTextChanged(Editable s) {
            if (!isDisposed()) {
                view.removeTextChangedListener(this);
                observer.onNext(s);
                view.addTextChangedListener(this);
            }
        }

        @Override
        protected void onDispose() {
            view.removeTextChangedListener(this);
        }
    }
}

EditableRxTextView.java

代码语言:javascript
复制
public final class EditableRxTextView {
    @CheckResult
    @NonNull
    public static InitialValueObservable<CharSequence> textChanges(@NonNull TextView view) {
        return new EditableTextViewTextObservable(view);
    }
}

使用

代码语言:javascript
复制
EditableRxTextView.textChanges(editText)
            .map(CharSequence::toString)
            .debounce(200, TimeUnit.MILLISECONDS)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(input -> {
               output = //...do something with input
               editText.setText(ouput)
             }));
票数 6
EN

Stack Overflow用户

发布于 2018-09-18 08:33:00

我的解决方案是在设置文本时使用editText.getText().replace(...)不触发TextWatcher

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50797759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档