RxBinding TextChanges不会继续发出文本更改

时间:2018-01-06 12:16:36

标签: android rx-java rx-binding

试图弄清楚为什么RxTextView.textChanges只发出初始值。我的理解是它应该向下游订阅发出所有新的文本更改。

这是代码

    public class SignupFragment extends Fragment {

    @BindView(R.id.text_name) EditText txtName;
    @BindView(R.id.text_email) EditText txtEmail;
    @BindView(R.id.text_password) EditText txtPassword;
    @BindView(R.id.text_confirm_password) EditText txtConfirmPassword;
    @BindView(R.id.btn_signup) Button btnSignup;
    SignupViewModel viewModel;
    private CompositeDisposable disposables;

    FragmentSignupBinding binding;
    @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_signup, container, false);
        ButterKnife.bind(this, view);
        this.disposables = new CompositeDisposable();

        RxTextView.textChanges(txtEmail)
                .subscribe(new Observer<CharSequence>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(CharSequence charSequence) {
                        Log.d("Subscription", charSequence.toString());
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onComplete() {
                        Log.d("Subscription", "On Complete");
                    }
                });

        viewModel = ViewModelProviders.of(this).get(SignupViewModel.class);
        viewModel.applyInputs(RxTextView.textChanges(txtName),
                RxTextView.textChanges(txtEmail),
                RxTextView.textChanges(txtPassword),
                RxTextView.textChanges(txtConfirmPassword),
                RxView.clicks(btnSignup));


        Disposable validInputs =
        viewModel.validInputs()
                .doOnNext(new Consumer<Boolean>() {
                    @SuppressLint("TimberArgCount")
                    @Override
                    public void accept(Boolean aBoolean) throws Exception {
                        Timber.d("Valid inputs: %b", aBoolean.booleanValue());
                    }
                })
                .subscribe(RxView.visibility(btnSignup));

        disposables.add(validInputs);

        FragmentSignupBinding binding = FragmentSignupBinding.inflate(inflater, container, false);
        return binding.getRoot();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        this.disposables.dispose();
    }
}

此前编辑过来专注于我认为问题的位置。现在这是完整的图片。

3 个答案:

答案 0 :(得分:1)

我没有正确处理Fragment Data Binding。在代码的这一点上,它甚至是不必要的。我没有意识到设置可能会影响RxBindingings。

以下代码被破坏了......

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_signup, container, false);
...

        FragmentSignupBinding binding = FragmentSignupBinding.inflate(inflater, container, false);
        return binding.getRoot();
    }

以下代码现在可以使用....

    @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        FragmentSignupBinding binding = DataBindingUtil.inflate(inflater, R.layout.fragment_signup, container, false);
        View view = binding.getRoot();
        ButterKnife.bind(this, view);
        this.disposables = new CompositeDisposable();
....
        return view;
    } 

答案 1 :(得分:1)

    RxTextView.textChanges(txtEmail)
            .subscribe(new Observer<CharSequence>() {

这是错的,应该是

disposables.add(RxTextView.textChanges(txtEmail)
        .subscribe(new DisposableObserver<CharSequence>() {

另外,RxView.clicks(例如只能支持1个侦听器,因为它包含了setOnClickListener()方法。

因此,您的代码很可能会像这样工作

Observable<CharSequence> obsName;

...
public void onCreate(...) {
    ...
    obsName = RxTextView.textChanges(txtName).share();

然后在任何地方使用obsName,对于您拥有的其他Rx___电话也一样。

答案 2 :(得分:0)

我认为每个事件类型只能有1个observable。

在你的情况下添加第二个删除前一个。

尝试评论除RxTextView.textChanges(txtEmail)之外的所有内容。

请参阅有关此问题的讨论:only one observable at a time?