【问题标题】:Presenter Instructing Current Activity to Inflate Next Activity; Violation of MVP Rules or Not演示者指示当前活动为下一个活动充气;是否违反 MVP 规则
【发布时间】:2018-12-15 00:31:03
【问题描述】:

考虑到在 Android 中,您需要一个包上下文才能使用意图从当前活动中膨胀下一个活动。但是,对于 MVP,presenter 意味着是一个纯 Java 类,它不会像 Android 框架本身那样依赖于依赖项。

在视图中实现两个方法是否合适;一种要求演示者显示新视图 showNew(IView 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 活动

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 上下文类)?

【问题讨论】:

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


    【解决方案1】:

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

    Android 活动

    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。我认为这种方法更简洁,因为您不需要将活动类本身传递给演示者。

    【讨论】:

    • 你是对的。我可以更好地理解这种方法。虽然这意味着对于具有多个按钮的活动可以触发不同的 nextActivity,但我们必须在其中定义多个 navigateToNextActivity() 方法。而在我谈论的另一种方法中,使用单个方法 showNew(IBaseView nextActivity) 用户可以以通用方式导航,即使视图中没有指定 nextActivity 是什么的特定方法.
    猜你喜欢
    • 2021-12-31
    • 2016-03-22
    • 2018-06-02
    • 1970-01-01
    • 2011-06-09
    • 2018-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多