2016-12-19 1 views
3

SignUpFragmentは、SignUpPresenterとSignUpFragmentをSignUpViewに埋め込んで使用します。私はSignUpPresenterに私はRxAndroidを経由して検証を追加するかどうかを知りたいMVPパターンでPresenterの指定されたビューコンポーネントにアクセスする方法は?

view().showResult() 
view().showError() 

::のような)

public abstract class BasePresenter<V> { 

private WeakReference<V> mView; 

public void bindView(@NonNull V view) { 
    mView = new WeakReference<>(view); 
    if (setupDone()) { 
     updateView(); 
    } 
} 

public void unbindView() { 
    mView = null; 
} 

protected V view() { 
    if (mView == null) { 
     return null; 
    } else { 
     return mView.get(); 
    } 
} 

protected abstract void updateView(); 

private boolean setupDone() { 
    return view() != null; 
} 
} 

public interface SignUpView extends BaseView { 
void showResult(UserInfo result); 
} 

SignUpPresenter(ビュー経由SignUpFragmentと接続:SingUpPresenterはBasePresenterがBasePresenter を拡張

Observable<CharSequence> loginObservable = RxTextView.textChanges(mEmail); 

SignUpPresenterのSignUpFragmentのmEmailにアクセスしたいということです。

私は mEail = view().getEditTextEmail();

ようSignUpPresenterに使用することができますまたは私はアクティビティ/フラグメント内のすべてのこの部分を追加する必要が

public EditText getEditTextEmail(){return mEmail;} 

:ようSignFramgnet方法でメソッドを追加することがokです

Observable<CharSequence> loginObservable = RxTextView.textChanges(mLogin); 
loginObservable 
    .map(this::isValidLogin) 
    .subscribe(isValid -> mLogin.setCompoundDrawablesRelativeWithIntrinsicBounds(null,null, (isValid ? mValidField : mInvalidField), null)); 
+0

通常、あなたのプレゼンターはAndroidについて何も知っていないはずなので、Presenter内の 'RxTextView'を使用すると場所が違って見えます。 – Egor

+0

素晴らしい!そのような場合、これをFramgnet/Activityにすべて追加する必要がありますか? 監視可能な emailObservable = RxTextView.textChanges(mEmail); emailObservable .map(this :: isValidEmail) .subscribe(isValid - > mEmail.setCompoundDrawablesRelativeWithIntrinsicBounds(null、null、(isValid?mValidField:mInvalidField)、null)); –

+0

はい、これはすべて私のUIコードのようです。 Presenterが電子メールを検証するようにするには、 'presenter.isValidEmail()'に対してマップするだけです。 – Egor

答えて

2

ビュー内にloginObservableを作成してPresenterに渡します。 Observable<CharSequence>はAndroid Frameworkの一部ではないため、簡単にユニットテストができます。

//View 
Observable<CharSequence> loginObservable = RxTextView.textChanges(mEmail); 
presenter.setLoginObservable(loginObservable); 

//Presenter 
void setLoginObservable(Observable<CharSequence> observable) { 
    observable 
     .map(this::isValidLogin) 
     .subscribe(isValid -> { 
      //call appropriate view methods 
     }); 
+0

このビデオでは、https://www.youtube.com/watch?v=QdmkXL7XikQ 2:40で、私たちがloginObservables = RxTextView.textChanges(mEmail)のような不変ストリームを扱っているときにloginObservables.map(this :: isValidLogin)とRxTextView.textChanges(mEmail).map(this :: isValidLogin)は異なるので、それらを分けることはお勧めしません あなたはどう思いますか? –

+0

プレゼンターに観察可能に渡すためには別にする必要があります。 –

関連する問題