Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 演示者指示当前活动为下一活动充气;是否违反MVP规则_Java_Android_Mvp_Android Mvp_Clean Architecture - Fatal编程技术网

Java 演示者指示当前活动为下一活动充气;是否违反MVP规则

Java 演示者指示当前活动为下一活动充气;是否违反MVP规则,java,android,mvp,android-mvp,clean-architecture,Java,Android,Mvp,Android Mvp,Clean Architecture,考虑到在Android中,您需要一个包上下文,以便能够使用意图从当前活动中膨胀下一个活动。然而,有了MVP,presenter就意味着它是一个纯Java类,不会像Android框架本身那样依赖于依赖项 从这个角度来看,实施两种方法是否合适;要求演示者显示一个新视图showNew(IView活动),然后演示者通过将新视图传递回当前视图并要求其使用其(活动)上下文放大请求的下一个视图来授权此请求 换句话说,演示者仍然是命令创建下一个视图的人,只是它通过当前视图的上下文来创建 请参见下面的示例代码:

考虑到在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方法

  • 如果(1)违反了规则或不够干净,有没有更好的方法让演示者创建视图(而不知道Android上下文类)


  • 在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是什么的特定方法。