5

我正在开发一个显示列表的小型应用程序,当单击一个项目时,它会打开一个包含项目详细信息的辅助屏幕。我想实现 MVP 作为我的这个应用程序的架构,当我有一个包含 2 个片段的活动时,我一直在努力弄清楚如何做到这一点。

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

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

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

感谢任何帮助!谢谢!

4

2 回答 2

1

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

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

我之所以选择这个解决方案,是因为它的抽象级别和以后在其他活动中重用任何片段而不更改任何代码的能力。

解决原则:

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

图取自谷歌的 github 页面:

来自 github 项目的解决方案图


更新:链接无效,谷歌似乎从他们的样本中删除了该项目。会留下它,以防他们重新上传。

于 2018-11-08T06:51:05.717 回答
0

实现 MVP 的方法可能有很多。我们主要使用 3 样东西。- 视图 - 演示者 - 模态

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

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

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

视图结构:

public interface LoginView {
void showProgress();

void hideProgress();

void setUsernameError();

void setPasswordError();

void navigateToHome();
}

现在这些是您需要在您的视图类(活动/片段)和您的逻辑部分所在的演示者上实现的类。

现在关于您的查询。

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

谁负责打开第二个片段?

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

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

于 2017-09-26T17:51:06.893 回答