主持人指示当前活动充实下一个活动;是否违反MVP

时间:2018-07-06 11:42:32

标签: java android mvp android-mvp clean-architecture

考虑到以下事实:在Android中,您需要一个包上下文才能使用意图从当前活动中扩展下一个活动。但是,使用MVP时,演示者只能是纯Java类,不会像Android框架本身那样依赖于依赖项。

在视图中实现两个方法是否合适?要求演示者显示新视图 showNew(IView活动),然后演示者通过将新视图传递回当前视图并要求其使用其(活动)上下文来授权此请求。放大请求的下一个视图。

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

请参见下面的示例代码:

查看界面

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活动

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下一步活动

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

摘要

视图创建下一个视图,但仅在演示者的指导下。因为演示者需要当前视图的上下文才能放大下一个视图。

问题

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

  2. 如果(1)违反或不够干净,是否有更好的方法可以使演示者创建视图(不了解Android上下文类)?

1 个答案:

答案 0 :(得分:1)

在MVP模式中,persenter告诉view怎么做。您将下一个活动类传递给演示者,然后演示者将该活动类发回查看的方式是不必要的IMO。主持人为什么不告诉视图导航到哪个活动而不知道活动类本身?我的意思是这样的:

Android活动

   <marker position="lat_Lon" [geoFallbackPosition]="lat_Lon"></marker>

具体演示者

   <custom-marker *ngFor="let pos of positions; let i = index" (initialized$)="init($event)" [position]="pos.Lat_Lon">
              <img src="custom-marker.png" />
            </custom-marker>

您可以在视图中找到一种方法,其作用是导航到特定视图,即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。我认为这种方法比较干净,因为您不需要将活动类本身传递给演示者。