ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-10-26 01:27:49  阅读:158  来源: 互联网

标签:mvp android


我在新应用程序中实施MVP,然后遇到一个问题.我需要在View(活动)本身内部调用View的方法.按定义将MVP代码分离是错误的事情.

根据定义:

演示者负责模型和视图之间的编排.它基本上从双方接收事件并因此采取行动.演示者是唯一认识他人的组件.它具有对视图的引用和对模型的引用. (source)

在同一篇文章中,提到View不会对用户交互做出反应,而是将控制权交给Presenter来完成.我也阅读了关于依赖规则的this SOF post.

就我而言,我正在使用自定义AppTheme.需要在setContent()调用之前设置AppTheme,我正在做的是在View接口中创建一个名为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.

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

编辑:更多说明

我的视图实际上是Activity类.这是MVP的视图,而不是Android API的View类.问题是,有一个方法setAppTheme()仅与MVP的视图(Android的活动)相关.此调用不在合同中(AboutUsMVP.java),根据Google约定,该调用应为AboutUsContract.java,此setAppTheme()不在合同中,并且不能,因此是否违反了MVP原则?

没有可能的替代方法,可以说创建setAppTheme()的接口,如果这样做,则将不起作用,因为:

setAppTheme()仅在super()方法之后被调用,否则就没有用. MVP的演示者开始在onResume中工作.如果建立了一个接口,并将setAppTheme()纳入MVP的管辖范围,则它将无效.

解决方法:

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

这可能会导致一些混乱.谁负责调用某些方法?正如您所说的,View必须执行诸如setOnClickListener之类的某些操作,但是演示者负责处理该事件.只要记住这一点:

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

现在,您正在制作一个移动应用程序.但是,如果您要编写控制台或桌面应用程序的代码,则表示逻辑不会改变.特定于“ View技术”的所有操作(Android,桌面等)都应在该技术特定的代码内执行.这样,您的代码将被轻松地耦合到您的技术堆栈

标签:mvp,android
来源: https://codeday.me/bug/20191025/1932573.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有