考虑到以下事实:在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
}
摘要
视图创建下一个视图,但仅在演示者的指导下。因为演示者需要当前视图的上下文才能放大下一个视图。
问题
这种方法是否违反了MVP方法
如果(1)违反或不够干净,是否有更好的方法可以使演示者创建视图(不了解Android上下文类)?
答案 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
。我认为这种方法比较干净,因为您不需要将活动类本身传递给演示者。