Android MVP - 在 View 实现( fragment 或 Activity )中调用 View 方法

标签 android mvp

我在我的新应用程序中实现 MVP,然后我遇到了一个问题。我需要在 View (Activity) 本身内部调用 View 的方法。根据 MVP 代码分离的定义,这是错误的做法。

根据定义:

Presenter 负责模型和 View 之间的编排。它基本上从两者接收事件并据此采取行动。 Presenter 是唯一知道其他组件的组件。它有一个对 View 的引用和另一个对模型的引用。 ( source )

在同一篇文章中提到 View 不会对用户交互使用react,它将控制权交给 Presenter 来完成这项工作。我也读过this SOF post关于依赖规则。

就我而言,我使用的是自定义 AppThemeAppTheme 需要在 setContent() 调用之前设置,我正在做的是在 View 接口(interface)中创建一个名为 setAppTheme() 的方法 我的 Activity 实现的,并且有应用主题的代码。现在的问题是,这是在应用程序中调用的,它在其实现中调用了 View 方法。

To sum up, what my understanding of MVP either one of the following should be true:

  • Do call View method inside Activity, because setTheme() wont work after setContent() and our presenter.setView() is in onResume(), but will this satisfy MVP separation of M-V-P ?

  • Do not make interface method for setAppTheme(), instead create a private method in Activity which sets theme. This method will have nothing to do with any layer of MVP. But question is, if project is using MVP pattern, is this practice valid?

这是我的 MVP:

public class AboutUsMVP
{

    public interface Model
    {


        String getFbLink();
        String getTwitterLink();
        String getEmailLink();
        String getCompanyLink();

    }

    public interface Presenter
    {
        void setView( View view );

        void fbButtonClicked();

        void twitterButtonClicked();

        void emailButtonClicked();

        void imageButtonClicked();

    }

    public interface View
    {

        void showFacebookPage();
        void showTwitterPage();
        void showEmailIntent();
        void showCompanyWebsite();
        void setAppTheme();
        void setCustomActionBar();

    }

}

请指出我遗漏的错误。

From what I know, same case can be argued in the light of setActionBar() and setOnClickListener() methods, although these may require their separate post, but they are more relevant here and new post for either of them will be duplicate.

请注意,我的Activity 实现了 View 接口(interface)。

编辑:更多解释

我的View其实就是Activity类。这是 MVP 的 View ,不是Android API 的View 类。问题是,有一个方法 setAppTheme() 只与 MVP 的 View(Android 的 Activity)相关。此调用不在契约(Contract) (AboutUsMVP.java) 中,按照 Google 的惯例应为 AboutUsContract.java,此 setAppTheme() 不在契约(Contract),它不可能,那么这是否违反了 MVP 原则?

没有可能的选择,可以说做一个 setAppTheme() 的接口(interface),如果我这样做,它不会工作,因为:

setAppTheme() 紧接在 super() 方法之后被调用,否则它是无用的。 MVP 的演示者开始在 onResume 中工作。如果做了一个接口(interface),setAppTheme() 被纳入MVP的管辖范围,则不会有任何效果。

最佳答案

事实上,MVP 中的View应该是愚蠢的。这是:它们不包含任何逻辑。只需接收用户生成的事件并立即将其工作委托(delegate)给演示者。 View 还可以通知演示者 一些事件 已经发生( View 已创建、屏幕旋转等)

这可能会导致一些混淆。谁负责调用某些方法?正如您所说,View 必须 执行一些操作,例如 setOnClickListener,但演示者负责处理事件。请记住这一点:

The View is just an interface. This means that you can use anything that implements that interface

现在您正在制作一个移动应用程序。但是,如果您想编写控制台或桌面应用程序,则表示逻辑不会改变。任何特定于“View 技术”(安卓、桌面等)的内容都应该在特定于该技术的代码中执行。这样您的代码将松散地耦合到您的技术堆栈

关于Android MVP - 在 View 实现( fragment 或 Activity )中调用 View 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44406496/

相关文章:

android - 使用 asynctask 进行多次下载

architecture - 在 Monodroid 应用程序中重用 Monotouch 代码

java - MVP(Android) 中的 Presenter 对象出现空对象引用错误

android - 如何使用 MVP 从 RecyclerView 插入/删除项目

android - 如何以编程方式在android中添加到主屏幕的快捷方式

android - Android 应用程序中的设计建议

java - 如何将网站变成Android应用程序

android - Eclipse中的android布局文件问题

model-view-controller - 新的 Web 应用程序应该遵循 MVC 还是 MVP 模式?

GWT:在 MVP 设计中,底层页面布局是否应该被视为一个 View ?