android - 在 RxJava 中观察一个基本的自定义事件

标签 android rx-java rx-android

我刚刚开始尝试在这里学习 RxJava/RxAndroid,我正在尝试验证表单。我使用了 Kaushik Gopal 的 lovely example here并让我的编辑文本很好地与 combineLatest 订阅一起使用。现在我想观察其他东西作为同一订阅的一部分。我有一个按钮可以选择出生日期,它会在我的 Fragment 的 onActivityResult() 函数中返回它的结果。我需要什么样的观察者?

private Observable<CharSequence> mNameChangeObservable; //etc.
private Observable<Date> mDateChangeObservable;

OnCreateView():

mIDNumberChangeObservable = RxTextView.textChanges(mIDNumberEditText).skip(1);
mNameChangeObservable = RxTextView.textChanges(mNameEditText).skip(1);
mEmailChangeObservable = RxTextView.textChanges(mEmailEditText).skip(1);
mPasswordChangeObservable = RxTextView.textChanges(mPasswordEditText).skip(1);

//mDateChangeObservable = ???;

订阅:

    private void combineLatestEvents() {
    mSubscription = Observable.combineLatest(mLLNumberChangeObservable,
            mNameChangeObservable,
            mEmailChangeObservable,
            mPasswordChangeObservable,
            mDateChangeObservable,
            new Func5<CharSequence, CharSequence, CharSequence, CharSequence, Date, Boolean>() {
                @Override
                public Boolean call(CharSequence newIDNumber,
                                    CharSequence newName,
                                    CharSequence newEmail,
                                    CharSequence newPassword,
                                    Date newDate) {

                    boolean idNumberValid = !isEmpty(newIDNumber) && newIDNumber.length() == 8;
                    if (!idNumberValid) {
                        mLLNumberEditText.setError("Invalid ID Number!");
                    }

                    boolean nameValid = !isEmpty(newName);
                    if (!nameValid) {
                        mNameEditText.setError("Invalid Name!");
                    }

                    boolean emailValid = !isEmpty(newEmail) &&
                            EMAIL_ADDRESS.matcher(newEmail).matches();
                    if (!emailValid) {
                        mEmailEditText.setError("Invalid Email!");
                    }

                    boolean passValid = !isEmpty(newPassword) && newPassword.length() >= 8;
                    if (!passValid) {
                        mPasswordEditText.setError("Invalid Password!");
                    }

                    //Validate Date

                    return idNumberValid && nameValid && emailValid && passValid;
                }
            })//
            .subscribe(new Observer<Boolean>() {
                @Override
                public void onCompleted() {
                }

                @Override
                public void onError(Throwable e) {
                }

                @Override
                public void onNext(Boolean formValid) {
                    if (formValid) {
                        mSubmitButton.setEnabled(true);
                    } else {
                        //Also print error here
                        mSubmitButton.setEnabled(false);
                    }
                }
            });
}

OnActivityResult:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode != Activity.RESULT_OK) return;
    if (requestCode == REQUEST_DATE) {
        mDate = (Date) data.getSerializableExtra(Constants.Extras.EXTRA_DATE);
        updateDobButtonText(mDate);

        //Somehow tell my subscription I have a new date
    }
}

最佳答案

您可以按照当前的模式从按钮获取事件。 ButtonTextView 的子类,因此您可以使用 Button 作为参数调用 RxTextView.textChanges()。它会在按钮文本更改时发出项目。具体来说,如果这一行

updateDobButtonText(mDate);

调用 Button.setText(),您应该在订阅者上获得事件。

关于android - 在 RxJava 中观察一个基本的自定义事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33263466/

相关文章:

android - 单击按钮更改 TextView 文本 (Android)

android - 通过改造按顺序将图像上传到 REST API

java - RX java/Android 我如何使用 debounce 运算符在每次点击时实现 This toast

java - 订阅和取消订阅每个发出的项目

android - 如何借助Timepicker设置时间? 12 小时格式

android - java.lang.RuntimeException : Unable to load script. 确保您正在运行 Metro 服务器(运行 'react-native start')或者您的包

android - 在 Android 的 View Flipper 上触摸滚动?

kotlin - 是否有与 RxJava 的 onDispose 等效的 Kotlin Coroutines Channel?

android - 将响应返回为 Flowable 时不会调用 onComplete

android - 如何实现对可运行线程的简单 RxJava 调用?