Java 演示者指示当前活动为下一活动充气;是否违反MVP规则
考虑到在Android中,您需要一个包上下文,以便能够使用意图从当前活动中膨胀下一个活动。然而,有了MVP,presenter就意味着它是一个纯Java类,不会像Android框架本身那样依赖于依赖项 从这个角度来看,实施两种方法是否合适;要求演示者显示一个新视图showNew(IView活动),然后演示者通过将新视图传递回当前视图并要求其使用其(活动)上下文放大请求的下一个视图来授权此请求 换句话说,演示者仍然是命令创建下一个视图的人,只是它通过当前视图的上下文来创建 请参见下面的示例代码: 查看界面Java 演示者指示当前活动为下一活动充气;是否违反MVP规则,java,android,mvp,android-mvp,clean-architecture,Java,Android,Mvp,Android Mvp,Clean Architecture,考虑到在Android中,您需要一个包上下文,以便能够使用意图从当前活动中膨胀下一个活动。然而,有了MVP,presenter就意味着它是一个纯Java类,不会像Android框架本身那样依赖于依赖项 从这个角度来看,实施两种方法是否合适;要求演示者显示一个新视图showNew(IView活动),然后演示者通过将新视图传递回当前视图并要求其使用其(活动)上下文放大请求的下一个视图来授权此请求 换句话说,演示者仍然是命令创建下一个视图的人,只是它通过当前视图的上下文来创建 请参见下面的示例代码:
public interface IBaseView{
void showAnother(Class nextActivity);
}
public interface IBasePresenter {
void showNew(IBaseView nextActivity);
}
演示者界面
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());
}
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();
}
}
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);
}
}
public class SampleNextActivity extends AppCompatActivity implements IBaseView {
//activity details here
}
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);
}
}
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);
}
}
public class SampleNextActivity extends AppCompatActivity implements IBaseView {
//activity details here
}
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 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);
}
}
public class SampleNextActivity extends AppCompatActivity implements IBaseView {
//activity details here
}
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);
}
}
视图创建下一个视图,但仅在演示者的指示下创建。因为演示者需要当前视图的上下文才能放大下一个视图
问题
在MVP模式中,persenter告诉view要做什么。您将下一个活动类传递给演示者,然后演示者将该活动类发送回视图的方式在我看来是不必要的。演示者为什么不在不知道活动类本身的情况下告诉视图导航到哪个活动?我的意思是这样的: 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);
}
}
public class SampleNextActivity extends AppCompatActivity implements IBaseView {
//activity details here
}
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 Presenter implements IBasePresenter {
IBaseView view;
public Presenter(IBaseView view){
this.view = view;
}
@Override
public void showNew(IBaseView nextActivity) {
view.showAnother(nextActivity.getClass());
}
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();
}
}
您可以在视图中有一个方法,其任务是导航到特定视图,即
nextractivity
。如果您有更多活动,可以为每个活动定义一个方法。当用户单击按钮时,您告诉演示者用户单击了按钮。然后在SamplePresenter#buttonClicked()
中单击按钮后,您可以执行一些逻辑操作,然后告诉视图导航到下一个活动。我认为这种方法更简洁,因为您不需要将活动类本身传递给演示者。您是对的。我能更好地理解这种方法。虽然这意味着对于具有多个按钮的活动,可以触发不同的NextActivity,但我们必须在其中定义多个navigateToNextActivity()方法。在我提到的另一种方法中,使用单个方法showNew(IBaseView nextActivity),用户可以以通用方式导航,即使视图中没有指定nextActivity是什么的特定方法。