【问题标题】:Android MVP: defining Presenter in FragmentsAndroid MVP:在 Fragments 中定义 Presenter
【发布时间】:2018-09-18 19:49:08
【问题描述】:

我在 Google 和 Stackoverflow 上进行了大量搜索,但我仍然感到困惑,所以在这里问一个问题。

我有这个小型 MVP 设计模式 -

SigninView.java

public interface SigninView{

    void onSuccess();
    void onError();
    void onComplete();
}

SigninPresenter.java

public interface SigninPresenter {

    void signIn(String emailID, String password);
}

SigninModel.java

public class SigninModel implements SigninPresenter {

    private SigninView mSigninView;

    public SigninModel(SigninView mSigninView) {
        this.mSigninView = mSigninView;
    }

    @Override
    public void signIn(String emailID, String password) {

        if(emailID.equals("abc@example.com") && password.equals("123")){
            mSigninView.onSuccess();
        }
        else{
            mSigninView.onError();
        }

        mSigninView.onComplete();

    }
}

我想在 Fragment 上实现 SigninView 并像这样定义 SigninPresenter -

SigninPresenter mSigninPresenter = new SigninModel(view_of_mvp);
mSigninPresenter.signIn("adadada", "asads");

在此处查看一个参考。我想在 Fragment 上实现一个 View 并定义一个 Presenter - https://github.com/ashokslsk/Comprehensive-MVP/blob/master/app/src/main/java/com/ashokslsk/mvpexample/MainActivity.java

如何实现?

【问题讨论】:

    标签: android fragment mvp presenter


    【解决方案1】:

    您实际上不需要传递上下文,而是您的 SigninView 的实现。所以你需要让你的片段实现SigninView

    MyFragment implements SigninView
    

    并简单地用this 初始化演示者,而不是上下文。实际上,您的演示者应该不太了解 Android SDK,因此它不应该处理上下文。看到这个answer

    SigninPresenter mSigninPresenter = new SigninModel(this);
    

    编辑:

    你有这样的活动:

    public class MainActivity extends AppCompatActivity implements SigninView 
    

    您所要做的就是让您的片段实现 SigninView:

    public class MyFragment extends Fragment implements SigninView 
    

    然后,在 onCreateView 中,您可以像这样初始化演示者:

    signinPresenter = new SigninPresenterImpl(this);
    

    【讨论】:

    • 另一件事。开发人员通常不会像我一样在 MVP 中使用 Fragments 吗?我问这个问题是因为我搜索了很多,但实际上并没有找到这样的东西。我喜欢保持简单。
    • 我们确实这样做了,这真的取决于您的需求。关键是 MVP 中的 View 可以是 Activity、Fragment 甚至是 View 对象。如果您查看 Google github.com/googlesamples/android-architecture/blob/todo-mvp/… 提供的此代码示例,他们将片段用作 MVP 中的视图,
    • 所以在 MVP 中将片段作为 V 是很常见的,最终取决于您的需求。
    • 在上面的答案中,我们如何在片段中将“this”作为上下文传递?
    • 片段不从上下文扩展(如活动和服务),因此您不能将片段作为上下文传递。你可以调用 this.getContext() 从片段中获取上下文
    【解决方案2】:

    您的视图已经实现了getContext()。只需将其添加到您的界面并在您的SigninModel 中调用它:

    SigninPresenter.java

    public interface SigninView {
    
        void onSuccess();
        void onError();
        void onComplete();
    
        Context getContext();
    }
    

    SigninModel.java

    mSigninView.getContext();
    

    【讨论】:

    • 这是 hack 还是标准方式?不是指点你,我只是想知道。正如我所说,我对这件事感到困惑。
    • 这不是 hack,这就是 Interface 的用途。
    猜你喜欢
    • 2014-07-15
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    • 1970-01-01
    • 2018-12-01
    • 1970-01-01
    相关资源
    最近更新 更多