在具有两个(或多个)片段的单个 activity 上实施 MVP

Implementing MVP on a single activity with two (or multiple) fragments

我正在开发一个显示列表的小应用程序,当单击某个项目时,它会打开一个包含项目详细信息的辅助屏幕。我想将 MVP 实现为该应用程序的架构,并且当我有 一个 activity 和 2 个片段 .[=11 时,我一直在努力弄清楚如何做到这一点=]

出现了一些问题,当单击列表中的项目时,会向第一个演示者发送回调,但此时,谁负责打开第二个片段?主持人 'talk' 互相交流?我应该通过 activity 完成吗?

一直在寻找具有实现 MVP 的多个片段的单个 activity 示例,但还找不到类似的东西。

(是的,可以用其他方式完成,但该应用程序的目的是学习在具有多个片段的单个 activity 上实现 MVP)

感谢任何帮助! 谢谢!

可能有很多方法可以实现 MVP。我们主要使用 3 种东西。 - 看法 - 主持人 - 模态

在创建这些东西之前,您应该清楚屏幕的工作方式。

例如,如果您想要登录屏幕。 首先创建 activity 的结构(使用接口)。就像您的演示者和视图将包含的内容 例如

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

视图结构:

public interface LoginView {
void showProgress();

void hideProgress();

void setUsernameError();

void setPasswordError();

void navigateToHome();
}

现在这些是您需要在您的视图 class (Activity/fragment) 和您的逻辑部分所在的呈现器上实现的 classes。

现在关于您的查询。

这意味着 activity 将有两个演示者实例。 不,您的 activity 不应该要求有多个演示者。它已经打开了片段引用(通过 id 或标签查找片段)。

谁负责打开第二个碎片?

您可以从其中任何一个打开它 Activity/fragment。 如果 Activity 使用 getfragmentsupportManager 如果片段使用 getfragmentManager

注意: 有关详细信息,请遵循此 git 示例。 https://github.com/antoniolg/androidmvp

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

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

我之所以选择此解决方案,是因为它的抽象级别以及以后无需更改任何代码即可在其他活动中重用任何片段的能力。

解决原则:

  • 每个片段都有一个由接口定义的呈现器。
  • 有一个更大的演示器实现了所有较小的演示器。
  • 较大的演示者持有对所有较小演示者的引用,当调用方法时,它只是将操作委托给相关演示者。
  • 片段被赋予 'big' 演示者作为他们的演示者,但实际上并没有意识到这种情况。
  • 较小的演示者应该持有对视图的引用。

图表取自 Google 的 git 中心页面:


更新: Link 无效,似乎 Google 从他们的示例中删除了该项目。将保留它以防他们重新上传它。