考虑到在 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 。
问题
这种方法是否以任何方式违反了 MVP 方法论
如果 (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/