プレゼンターのレイヤーからActivity
を開いた場合、それは反パターンでしょうか?Android MVPオープンプレゼンターからのアクティビティ、アンチパターン?
もしそうなら、私はビューレイヤーからアプリのナビゲーションを管理する必要がありますか?
プレゼンターのレイヤーからActivity
を開いた場合、それは反パターンでしょうか?Android MVPオープンプレゼンターからのアクティビティ、アンチパターン?
もしそうなら、私はビューレイヤーからアプリのナビゲーションを管理する必要がありますか?
はい、それは抗MVPパターンだが。 MVPのpassive viewに基づいて、プレゼンターのアンドロイドフレームワークに対処する必要がないため、テスト容易性が失われました。
だから、ビューレイヤーからアプリのナビゲーションを管理する方がよいでしょう。
class MyPresenter {
MyPresenter.View view;
void backButtonClicked() {
view.navigateToHomeScreen();
}
public interface View {
void navigateToHomeScreen();
}
}
class MyActivity extends Activity implements MyPresenter.View {
@Override
void navigateToHomeScreen() {
startActivity(...)
}
@OnClick(R.id.my_button)
void onClick() {
presenter.backButtonClicked();
}
}
また、この方法のもう1つの利点は、アクティビティをフラグメントまたはビューに置き換えることが容易になることです。
編集1:
Morgwaiは、この方法が問題と単一責任の分離を破るだろうと述べたが、あなたはすべての場所、単一の責任を持つことはできません。いつかそれを違反する必要があります。 Google for MVPの例は、TaskDetailFragment
内に新しいActivity
を開く責任を負うShowEditTask
を呼び出します。
しかし、また、あなたはそう
interface NavigationCommand {
void navigate();
}
よりよいアプローチであるCommandPatternを使用することができ、それが必要なときに、プレゼンターはそれを使用します。
私の意見では、ビューレイヤーからアクティビティを開くと良いでしょう。私はPresenterがアクティビティをできるだけ少なく知っていることを好みます。
活動を開始すべきかのいくつかの条件がある場合は、このようなものを使用することができます
public class Presenter {
private ViewsPresentation mViewsPresentation;
public void someButtonClicked() {
if (/*some condition*/) {
mViewsPresentation.startFirstActivity();
} else {
mViewsPresentation.startSecondActivity();
}
}
public interface ViewsPresentation {
void startFirstActivity();
void startSecondActivity();
}
}
私がaccepted answerにコメントしたように、ビューレイヤーからナビゲーションを管理すると、現在のUI画面を更新するためのビューのみが含まれていることになります。
Activity
とFragment
のクラスは、UI画面で操作し、startActivity
のような他のアクティビティを開始するインテントオブジェクトを送信する両方のメソッドを含んでいるため、アンドロイドプラットフォームの設計に由来します。
これを解決する明確な方法は、ナビゲーションに関連するメソッドを含むNavigator
インターフェイスを作成し、アクティビティを実装してプレゼンターに注入することです。少なくともプレゼンターの視点ナビゲーションとUI操作からのこの方法は分離されます。しかし、これはアクティビティの観点からは奇妙に見えるかもしれません。現在は、両方のインタフェース(ナビゲータとビュー)を実装し、その参照を2回プレゼンターに渡します。この理由から、ビューレイヤーからナビゲーションを管理することに決めた場合は、少なくとも、同じメソッドでナビゲーションとUI操作を実行しないでください。
このNavigatorインターフェイスのサンプルプロジェクトは実装されていますか? – toobsco42
エクストラを介してデータを渡す場合はどうすればよいですか?それは再びmvpに違反しないでしょうか?ビューはモデルについて何も知ってはならないからです。 – cylon
IMOには、現在のUI画面を更新するための唯一のメソッドが含まれている必要があります。従来のMVPでは、現在のプレゼンターが、他のプレゼンターがコントロールを(通常はメッセージバスを使用して)渡すことを決定すると、ターゲットのプレゼンターはそのビューを「キャンバス」に配置します。通常、アンドロイドナビゲーションはアクティビティまたはフラグメントオブジェクトを使用して実行され、ビューは通常フラグメントまたはアクティビティによって実装されるため、ビューオブジェクトもナビゲーションの実行によく使用されます。しかし、それは明確な分離懸念の分離を破っているIMO – morgwai
いいえ、あなたはどこか@SaeedMasoumiのAndroid MVP +コマンドパターンの例がありますか? – ericn