在单个活动中使用两个(或多个)片段实现MVP模式

5
我正在开发一个小应用程序,它显示一个列表,当用户点击其中一项时,会打开一个包含项目详细信息的二级屏幕。我想将MVP作为这个应用程序的架构实现,但是当我有一个只有两个片段的单个活动时,我一直在努力弄清楚如何做到这一点。
当列表中的项目被点击时,第一个Presenter会发送回调,但此时谁负责打开第二个Fragment?Presenter之间是否互相“交流”?还是通过Activity来完成?
我一直在寻找单个活动与多个Fragment实现MVP的示例,但尚未找到类似的内容。
(是的,也可以通过其他方式完成,但该应用程序的目的是学习在单个活动中使用多个Fragment实现MVP)
感激任何帮助! 谢谢!
2个回答

1

在研究了不同的MVP示例项目后,我决定遵循Google的“TODO-MVP-TABLET”git项目中的大部分概念,该项目可以在此处找到:

https://github.com/googlesamples/android-architecture/tree/dev-todo-mvp-tablet

我选择这个解决方案是因为它具有很高的抽象级别和能够在其他活动中重用任何片段而不更改任何代码的能力。
解决方案原则:
- 每个片段都有一个由接口定义的 Presenter。 - 存在一个实现所有较小 Presenter 的更大的 Presenter。 - 更大的 Presenter 持有对所有较小 Presenter 的引用,当调用方法时,只需将操作委托给相关的 Presenter。 - 片段将“大”Presenter 作为其 Presenter,但实际上并不知道这是情况。 - 较小的 Presenter 应持有视图的引用。
从 Google 的 github 页面获取的图表:

solution diagram from the github project


更新:链接无效,似乎谷歌已将该项目从其样例中删除。如果他们重新上传,我会保留它。


1
您提供的链接无法使用... 您有多少个演示者实现?我有一个带有演示者的活动,现在添加了3个片段。活动演示者可以实现片段演示者,但如何处理片段视图? - Andrey Rankov

0

实现MVP可能有很多种方式。我们主要使用以下三个组件: - 视图(View) - 展示器(Presenter) - 模型(Modal)

在创建这些组件之前,您应该清楚屏幕的工作原理。

例如,如果您想要一个登录屏幕。 首先创建活动的结构(使用接口),确定您的展示器和视图将包含什么。 例如:

public interface LoginPresenter {
    void validateCredentials(String username, String password);
    void onDestroy();
}

视图结构:

public interface LoginView {
void showProgress();

void hideProgress();

void setUsernameError();

void setPasswordError();

void navigateToHome();
}

现在这些是你需要在视图类(Activity/Fragment)和你的逻辑部分所在的Presenter上实现的类。

现在来谈论一下你的问题。

这意味着活动将拥有两个Presenter实例。 不,你的活动不应该需要具有多个Presenter。它已经拥有了打开的片段引用(通过findfragmentby id或tag)。

谁负责打开第二片段?

你可以从Activity/Fragment中的任何一个打开它。 如果使用Activity,请使用getfragmentsupportManager 如果使用Fragment,请使用getfragmentManager

注意:欲获得更多信息,请参阅此git示例。 https://github.com/antoniolg/androidmvp


谢谢你的回答,大部分MVP介绍我已经有并且了解(关于接口等)...你提到了一个git示例,但我看不到任何链接...也许你忘记添加了?至于活动不应该有多个主持人...好吧,如果每个片段都有一个主持人,并且活动是实例化它们的一个(在我的帖子中也在Google上链接的一些项目中看到过),那么活动怎么可能没有多个主持人呢? - mgR
Activity是实例化片段的对象,例如如果您将登录片段作为第一个片段,活动将对其进行实例化。登录的所有工作流程将由片段的视图、模型和展示器处理。成功登录后,第一个片段将打开另一个片段。同时,您可以在活动中放置公共变量,以便两个片段都可以访问它。 ((MainActivity)getActivity()).commonVariable - Harminder Singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接