【问题标题】:Enabling Button when EditText has text (RxAndroid)当 EditText 有文本时启用按钮 (RxAndroid)
【发布时间】:2016-03-29 15:22:05
【问题描述】:

RxJava/RxAndroid 新手,发现缺乏示例令人不安。作为开始使用 Rx 的一种方式,我喜欢尝试做一些小的工作。基本上,如果EditText 中输入了文本,则在其下方启用Button

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

根据我收集到的信息,我可以使用RxBindings 创建一个Observable,例如:

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

假设我现在需要.subcribe()Observer 来观察observable 的变化,但我不确定如何做到这一点。

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

编辑:虽然Retrolambda 存在,但显示如何在没有 lambda(或两者)的情况下实现此功能的答案会有所帮助。

【问题讨论】:

    标签: android rx-java rx-android


    【解决方案1】:
    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 来监视更改并在文本更改时发出项目。

    【讨论】:

    • 或者更简单一点(仍然没有retrolambda)你可以使用Action1&lt;Boolean&gt;而不是Subscriber&lt;Boolean&gt;
    • 请原谅我,但有人可以向我解释一下这比仅使用 TextWatcher“更好”吗?示例甚至不包括关键功能(“不要忘记取消订阅...”)真的是人吗?
    • @GregEnnis 对于单个EditText 不多。好处是在组合多个可观察对象或在后台线程上做一些事情时。看看stackoverflow.com/questions/21890338/…
    • @LordRaydenMK 谢谢你的链接。这确实解决了这个问题,但我不相信。我对接受的答案发表了评论,使用 kotlin 运算符如何使 rxjava 方式显得冗长和过时。 kotlin 在许多其他方面也好得多。
    • @GregEnnis Kotlin 确实有函数式运算符,但它们并没有取代 RxJava,它缺少线程的东西(subscribeOnobserveOn)...... Kotlin 和 Java8 Streams API 也被拉取基于,RxJava 是基于推送的....
    【解决方案2】:

    为了订阅Observable&lt;CharSequence&gt;,你需要这样做。

    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);
        }
    
    });
    

    至于您问题的第二部分:老实说,我不确定,但我猜您会在 EditText 上添加一个 TextWatcher 并在每次文本更改时触发一个事件 (@987654327 @)。

    【讨论】:

    • 意在补充,如果没有 lambdas 怎么办?我知道 retrolambda 存在,但在它被广泛接受或 Java 8 出现在 Android 之前,不使用它们的答案会更有洞察力。我将编辑问题。
    • 太棒了,我已经编辑了您的示例以更好地反映问题。希望我正确编辑了 lambda 部分。使用.skip() 运算符会等到输入了该数量的字符,但我注意到如果您随后删除输入的字符,该按钮仍保持启用状态。一旦edittext再次为空,使按钮再次被禁用会很简单吗?
    猜你喜欢
    • 2014-05-06
    • 1970-01-01
    • 1970-01-01
    • 2022-12-05
    • 1970-01-01
    • 1970-01-01
    • 2022-06-12
    • 2014-07-29
    • 2019-06-01
    相关资源
    最近更新 更多