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

Presenter Instructing Current Activity to Inflate Next Activity; Violation of MVP Rules or Not

考虑到 Android 中的事实,您需要一个包上下文才能使用意图从当前 activity 膨胀下一个 activity。然而,对于 MVP,演示者意味着是一个纯粹的 Java class,它不像 Android 框架本身那样依赖于依赖关系。

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

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

参见下面的示例代码:

查看界面

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 创建下一个视图,但只能在演示者的指令下进行。因为演示者需要当前视图的上下文才能膨胀下一个视图。

问题

  1. 这种方法是否违反了 MVP 方法

  2. 如果 (1) 违规或不够干净,是否有更好的方法让演示者创建视图(在不了解 Android 上下文的情况下 Class) ?

在 MVP 模式中,展示者告诉视图要做什么。您将下一个 activity class 传递给演示者,然后演示者将 activity class 发送回视图的方式在我看来是不必要的。为什么演示者不在不知道 activity class 本身的情况下告诉视图导航到哪个 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();
    }
}

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