当前位置: 首页 > 面试题库 >

RxTextView.textChanges与EditText上的setText

丁经国
2023-03-14
问题内容
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 做到这 一点


问题答案:

当我setText(output)循环时。要设置文本,我首先需要删除监听器,然后再次设置监听器。如何使用 RxJava 做到这 一点

为了满足要求,我设法如下扩展RxBinding源代码。

EditableTextViewTextObservable.java

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

public final class EditableRxTextView {
    @CheckResult
    @NonNull
    public static InitialValueObservable<CharSequence> textChanges(@NonNull TextView view) {
        return new EditableTextViewTextObservable(view);
    }
}

用法

EditableRxTextView.textChanges(editText)
            .map(CharSequence::toString)
            .debounce(200, TimeUnit.MILLISECONDS)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(input -> {
               output = //...do something with input
               editText.setText(ouput)
             }));


 类似资料:
  • 任何帮助都将得到承认。

  • 每当字符串发生更改时,就会调用。 现在,当我启动新的并通过发送数据时,不会被调用。

  • 我正在尝试实现一个仅将输入限制为大写字符[A-Z0-9]和数字。 我从某篇文章开始使用InputFilter方法。但我在三星Galaxy Tab 2上遇到了一个问题,但在模拟器或Nexus 4上没有。 问题是这样的: 当我键入“A”时,文本显示为“A”很好 现在,当我键入“B”时,文本应该是“AB”,但它给了我“AAB”,这看起来很奇怪 简而言之,它重复字符 以下是我正在使用此代码的代码: 文件代

  • 我有一个EditText-Field,并为它设置了一个OnFocusChangeListener。当它失去焦点时,将调用一个方法,该方法用数据库中的EditText检查EditText的值。如果方法的return-value为true,则显示一个toast并且焦点应该再次回到EditText上。焦点应该总是回到EditText上,键盘应该显示,直到方法的return-value为false。 ed

  • 我正在做Android智能电视应用: > 在中有一个自定义键盘和一个。 当应用程序启动时,焦点转到键盘。 null

  • 在设置输入类型多行时动作完成不工作。 我已经尝试了您在解决方案中提到的每一个代码,但我仍然面临同样的问题。我如何解决它? 如何使用ActionDone按钮(不带Enter按钮)实现多行EditText此答案在我的应用程序中尝试过,但不起作用。