当前位置: 首页 > 知识库问答 >
问题:

RxJava/RxAndroid-处理多个EditText更改

姜嘉荣
2023-03-14

我有3个EditText字段,我为这些字段创建了3个可观察对象。

    Observable<CharSequence> o1 = RxTextView.textChanges(field1);
    Observable<CharSequence> o2 = RxTextView.textChanges(field2);
    Observable<CharSequence> o3 = RxTextView.textChanges(field3);

当这三个字段都有值时,我想启用一个按钮。用户可以在字段中按任意顺序输入值。我该怎么做?

我用zip实现了这一点。

Observable<CharSequence> o1 = RxTextView.textChanges(field1);
Observable<CharSequence> o2 = RxTextView.textChanges(field2);
Observable<CharSequence> o3 = RxTextView.textChanges(field3);
Observable.zip(o1, o2, o3, (c1, c2, c3) -> c1.length() > 0 && c2.length() > 0 && c3.length() > 0).subscribe(myButton::setEnabled)

当我在所有三个文本字段中输入某个内容时,上面的这种情况就会起作用。e、 g.我在所有三个文本字段中输入了1个字符,然后按钮将被启用。但当我删除这三个字段中的任何一个字符时。zip不会被调用,因为它将等待其他2个文本字段流式传输一些数据,然后再调用订阅者上的onNext。因此,当我删除任何文本字段中的任何字符时,我希望我的按钮再次被禁用。我如何才能做到这一点?

共有2个答案

红智鑫
2023-03-14

试试这个,这肯定会成功的。使用组合最新。

//declare global variable
 private Subscription subscription = null;
 Observable<CharSequence> o1 = RxTextView.textChanges(field1);
 Observable<CharSequence> o2 = RxTextView.textChanges(field2);

 public void combineEvent(){
 subscription = Observable.combineLatest(o1, o2,
    new Func2<CharSequence, CharSequence, Boolean>() {
      @Override public Boolean call(CharSequence newEmail, CharSequence  newPassword) {
    //here you can validate the edit text
      boolean emailValid= !TextUtils.isEmpty(newEmail)
          &&    android.util.Patterns.EMAIL_ADDRESS.matcher(newEmail).matches();
        if(!emailValid){
          etEmailAddress.setError("Invalid Email");
        }
        boolean passValid = !TextUtils.isEmpty(newPassword)
            && newPassword.length() >6;
        if(!passValid){
          etPassword.setError("invalid password");
        }


        return emailValid && passValid;

      }
      }).subscribe(new Observer<Boolean>() {
    @Override public void onCompleted() {

    }

    @Override public void onError(Throwable e) {

  }

  @Override public void onNext(Boolean aBoolean) {
    if(aBoolean){
      //here you can enable your button or what ever you want.
      loginBtn.setEnabled(true);

    }else {
      loginBtn.setEnabled(false);
    }

  }
});
}
徐文彬
2023-03-14

使用AssociineLatest代替ziphttp://reactivex.io/documentation/operators/combinelatest.html

 类似资料:
  • 为什么我们需要将RxAndroid与RxJava一起使用?它们与实际使用RxAndroid和RxJava之间的功能差异是什么?我找不到合适的答案。

  • 我在视图布局中使用了三个EditText小部件,用于三个不同的过滤器。如果我输入其中一条,另一条文本不应该是空白的吗? 下面是我的片段: GenericTextWatcher方法: 当我运行这个程序并输入EditText时,logcat看起来是这样的: 03-03 15:25:39.616 25952-25952/com.xyz.abcI/art:显式并发标记扫描GC释放23671(1194KB)

  • 我已经阅读了很多关于rxjava调度器的答案,比如下面的用例,调度器io和调度器计算,rxjava2调度器io和具有大并发请求的调度器计算之间的区别是什么。 最常见的解释是使用Schedulers.computation()进行CPU密集型工作 并使用调度程序。io()用于与文件系统交互、与数据库或服务交互、REST API调用 通过CPU密集型工作,我假设/考虑图像调整大小/操作,大数据集等(如

  • 我对RxJava/RxAndroid还不熟悉,但我一直坚持使用我的用例。 我尝试迭代一个

  • 我正在使用较新的RX java,而不是 如果一切正常的话,这段代码几乎可以完美地工作。但如果我故意犯了个错误,比如我关掉了WiFi。而不是改型获得“UnknownHostException”...因为它应该发生在try catch块中的reverfit调用(getUser)中。但它没有将错误处理到onError(Throwable t)-->(我可以处理的地方),而是使应用程序崩溃。这就像错误从未

  • 问题内容: 在运行Linux 2.6.35+的系统中,我的程序创建了许多子进程并对其进行监视。如果子进程死了,我会进行一些清理并再次产生该进程。我经常在过程中获取信号。与异步使用。 当将信号处理程序用于非实时信号时,当信号处理程序针对特定信号运行时,必须阻止同一信号的进一步出现,以避免进入递归处理程序。如果此时有多个信号到达,则内核仅调用一次处理程序(当信号被解除阻塞时)。 使用时是否具有相同的行