View
(Activity
)本身内部调用View
的一个方法。按照MVP代码分离的定义,这是错误的做法。根据定义:
Presenter负责Model和View之间的协调。它基本上接收来自两者的事件并相应地行动。Presenter是唯一知道其他组件的组件。它有对View的引用和对Model的另一个引用。(来源source)
在同一篇文章中提到,
View
不会对用户交互做出反应,它将控制权交给Presenter
来完成工作。我还阅读了this SOF post关于依赖规则的内容。在我的情况下,我正在使用自定义的
AppTheme
。需要在调用 setContent()
之前设置 AppTheme
,我创建了一个名为 setAppTheme()
的方法,并将其添加到 View
接口中,由我的 Activity
实现,并在其中添加应用主题的代码。现在问题是,在应用内部调用这个方法会导致在其实现中调用 View
方法。总之,我对MVP的理解是以下两者之一应该成立:
1. 在Activity中调用View方法,因为setTheme()在setContent()后无法使用,而我们的presenter.setView()在onResume()中,但这是否满足MVP的M-V-P分离?
2. 不要为setAppTheme()创建接口方法,而是在Activity中创建一个私有方法来设置主题。这个方法与MVP的任何层都没有关系。但问题是,如果项目使用MVP模式,这种做法是否有效?
这是我的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();
}
}
请您指出我可能疏漏的错误。
据我所知,同样可以通过
setActionBar()
和setOnClickListener()
方法来讨论同一情况,尽管这些方法可能需要单独的帖子,但它们在这里更为相关,而且对它们的任何新帖子都将是重复的。
请注意,我的Activity实现了View接口。
编辑:更多说明
我的View实际上是Activity类。这是MVP的View,而不是Android API的View
类。问题是,有一个方法setAppTheme()
,它只与MVP的View(Android的Activity
)相关。这个调用不在合同(AboutUsMVP.java
)中,根据Google的惯例应该是AboutUsContract.java
,这个setAppTheme()
不在合同中,也不能在合同中,那么这是否违反了MVP原则?
没有可能的替代方案,可以说是制作setAppTheme()
的接口,但如果我这样做,它将无法工作,因为:
setAppTheme()
方法在调用super()
方法后立即调用,否则将无效。MVP的Presenter在onResume
中开始工作。如果创建了一个接口,并将setAppTheme()
带入MVP的范围内,则它将没有任何效果。
setView()
),然后Presenter调用setAppTheme
是正确的。在presenter.setView()
之后,你可以像平常一样调用setContentView
。 - Eselfar