java - Presenter 指示当前 Activity 膨胀下一个 Activity;是否违反MVP规则

标签 java android mvp android-mvp clean-architecture

考虑到在 Android 中,您需要一个包上下文才能使用 Intent 从当前 Activity 中扩充下一个 Activity 。然而,对于 MVP,演示者意味着是一个纯 Java 类,不像 Android 框架本身那样依赖于依赖项。

在 View 中实现两个方法合适吗?要求演示者显示新 View showNew(IView activity) 然后演示者通过将新 View 传回当前 View 并要求它使用其( Activity )上下文来授权此请求膨胀请求的下一个 View 。

换句话说,演示者仍然是命令创建下一个 View 的人,只是它通过当前 View 的上下文来执行。

参见下面的示例代码:

查看界面

public interface IBaseView{
    void showAnother(Class nextActivity);
}

演示者界面

 public interface IBasePresenter {
      void showNew(IBaseView nextActivity);
}

具体演示者

public class Presenter implements IBasePresenter {

IBaseView view;

public Presenter(IBaseView view){
    this.view = view;
}

@Override
public void showNew(IBaseView nextActivity) {
    view.showAnother(nextActivity.getClass());
}

Android Activity

public class SampleActivity extends AppCompatActivity implements IBaseView{

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sample);
}

public void onClick(View view){
    Presenter presenter = new Presenter(this);
    presenter.showNew(new SampleNextActivity());
}

@Override
public void showAnother(Class nextActivity) {
    Intent intent = new Intent(this, nextActivity);
    startActivity(intent);
}

}

Android 下一个 Activity

public class SampleNextActivity extends AppCompatActivity implements IBaseView {
    //activity details here
}

总结

View 创建下一个 View ,但仅在演示者的指令下。因为演示者需要当前 View 的上下文才能扩充下一个 View 。

问题

  1. 这种方法是否以任何方式违反了 MVP 方法论

  2. 如果 (1) 违规或不够整洁,是否有更好的方法让演示者创建 View (无需了解 Android 上下文类)?

最佳答案

在 MVP 模式中,展示者告诉 View 要做什么。您将下一个 Activity 类传递给演示者,然后演示者将该 Activity 类发送回 View 的方式是不必要的 IMO。为什么演示者不在不知道 Activity 类本身的情况下告诉 View 导航到哪个 Activity ?我的意思是这样的:

Android Activity

public class SampleActivity extends AppCompatActivity implements ISampleView {

    // ...

    public void onClick(View view){
        ISamplePresenter presenter = new SamplePresenter(this);
        presenter.buttonClicked();
    }

    @override
    public void navigateToNextView() {
        Intent intent = new Intent(this, nextActivity);
        startActivity(intent);
    }

}

具体演示者

public class SamplePresenter implements ISamplePresenter {

    ISampleView view;

    public Presenter(ISampleView view){
        this.view = view;
    }

    @Override
    public void buttonClicked() {
        // check if user can go to next activity
        view.navigateToNextView();
    }
}

您的 View 中可以有一个方法,其工作是导航到特定 View ,即 NextActivity。如果你有更多的 Activity ,你可以为每个 Activity 定义一个方法。当用户点击按钮时,您告诉演示者用户点击了按钮。然后您可以在 SamplePresenter#buttonClicked() 中单击按钮后执行一些逻辑操作,然后告诉 View 导航到 NextAcitivity。我认为这种方法更简洁,因为您不需要将 Activity 类本身传递给演示者。

关于java - Presenter 指示当前 Activity 膨胀下一个 Activity;是否违反MVP规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51209697/

相关文章:

Java 毫秒时间的日期转换

java - NamedParameterJdbcTemplate + TomCat,打开和关闭数据库连接

java - Twitter api - 每小时不超过 150 个请求

android - 单击 TextView 后禁用单击

c++ - MFC 应用程序的任何可测试架构或设计模式?

java - 每次用户单击 EditText 上的按钮时添加 Double

android: 我想在 Market 中使用 DRM

Android AndEngine : sprite. detachSelf() 不删除 Sprite

gwt - 围绕整个 GWT MVP 与 Activity 和 Places 的混淆

java - GWT 和动态选项卡