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

时间:2017-06-07 07:42:44

标签: android mvp

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

根据定义:

Presenter负责模型和视图之间的编排。它基本上从两者接收事件并因此采取行动。 Presenter是唯一了解其他人的组件。它引用了View,另一个引用了Model。source

在同一篇文章中提到View没有对用户交互作出反应,它将控制传递给Presenter来完成工作。我还阅读了关于依赖规则的this SOF post

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

  

总结一下,我对MVP的了解是以下哪一种   应该是真的:

     
      
  • View内调用Activity方法,因为setTheme()setContent()之后无法正常工作,presenter.setView()位于onResume()   setAppTheme(),但是这会满足M-V-P的MVP分离吗?

  •   
  • 不要为Activity创建接口方法,而是在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(); } } 中创建一个设置主题的私有方法。这种方法会有   与任何MVP层无关。但问题是,如果项目是   使用MVP模式,这种做法有效吗?

  •   

这是我的MVP:

setActionBar()

请指出我错过的错误。

  

据我所知,同样的案例可以根据其来论证   setOnClickListener()View方法,尽管这些方法   可能需要他们单独的帖子,但他们在这里更相关   其中任何一个的新帖都是重复的。

请注意,我的活动实现了View界面。

编辑:更多解释

我的视图实际上是Activity类。这是M V P的视图,不是 Android API的setAppTheme()类。问题是,有一个方法Activity只与MVP的视图,(Android的AboutUsMVP.java)相关。此调用不在合同(AboutUsContract.java)中,根据Google惯例setAppTheme(),此setAppTheme()不在合同中,而且不能,这是否违反了MVP原则?< / p>

没有可能的替代方案,可以说制作setAppTheme()的界面,如果我这样做,它将无效,因为:

super()方法之后调用

onResume,如果不是,则无效。 MVP的演示者开始在setAppTheme()工作。如果创建了一个接口,并且npm 进入了MVP的管辖范围,则它将无效。

2 个答案:

答案 0 :(得分:3)

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

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

  

View只是界面。这意味着您可以使用实现该接口的任何

现在您正在制作移动应用。但是,如果您想编写控制台或桌面应用程序,则表示逻辑不会更改。任何特定于&#34;查看技术&#34; (android,桌面等)应该在特定于该技术的代码内执行。这样,您的代码将松散地耦合到您的技术堆栈

答案 1 :(得分:1)

我相信@Pelocho的回答是正确的,你应该把它标记为正确的。但我想提出我的答案(同意他的答案),但是从另一种观点来看。关于这个不同的POV,我想讨论你对演示者的定义:

  

Presenter负责模型之间的编排   和视图

所以我在这里提出的问题是:&#34;演示者与之交互的模型是什么?&#34;。而我的回答是研究经典&#34;记笔记&#34;应用程序并认为该模型是文本和关联的元数据,通常存储在演示者将读取,解析并推送到视图的某些数据库中。

在这个&#34;模型中没有任何地方&#34;应用程序主题是相关的。主题纯粹是视图的功能。主题仅与其最终的屏幕外观相关联。就像视图是负责在屏幕上布局内容或知道要使用的字体大小的视图一样。

这意味着即使可以从用户设置选项更改布局,大小,颜色,它仍然不在演示者和模型的责任范围内,因为他们只对内容感兴趣。

<强> TL; DR:

直接从SharedPreferences上阅读Activity.onCreate(在super.onCreate之前)的主题,不要让Presenter参与其中。