首页 文章

我可以在Fragment中注册MVP Presenter吗?

提问于
浏览
10

我一直在关注Google提供的MVP设计模式来重构我的应用程序 . 我有一个MainActivity和许多片段,它一直在考虑在片段中注册演示者 . 我'm seeing is that every fragment register it'拥有主持人,但我不确定它有多大错... :)

所以这是我的演示者:

public class FirstPresenter implements FirstContract.Presenter {
    private final FirstContract.View mView;

    public FirstPresenter(FirstContract.View view) {
        mView = view;
    }

    @Override
    public void start() {
        Log.e(TAG, "Start");
    }
}

这是我的碎片:

public class FirstFragment extends Fragment implements FirstContract.View {
    private FirstContract.Presenter mPresenter;

@Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container
            , Bundle savedInstanceState) {
...
// I register firstFragment's presenter here.
mPresenter = new FirstPresenter(this);
...

所以我的问题是,这是正确的方法吗?我可以在活动中将Presenter注册到Fragment中吗?如果它不是正确的方法,是否有一些很好的例子来处理一个活动和多个片段的MVP?

谢谢你们,BR!

1 回答

  • 14

    正如您在 Google's 样本(https://github.com/googlesamples/android-architecture)中所见, Activities 创建 Presenters . 另外 Views 附加到 ActivityPresenters 获取视图( Fragments )作为参数 .

    Fragment 事务提交后 Fragment (查看)状态恢复 Presenters 得到创建并将 Fragments (视图)作为参数而不是调用

    view.setPresenter(T presenter);
    

    视图方法和 Presenters 注册查看 .

    我认为在 Fragment 中创建 Presenter 不是一个好习惯 . 首先,它们是 separate layers . 这对 Separation of concerns 来说是非法的 . 第二,如果您在 Fragment 中创建演示者,则绑定Presenter 's life to view' s LifeCycle ,当 Fragment 被销毁并重新创建时,您将创建一个新的演示者,但它们是不同的层 .

    The model 是定义要在用户界面中显示或以其他方式操作的数据的接口 .

    The presenter 对模型和视图起作用 . 它从存储库(模型)中检索数据,并将其格式化以在视图中显示 .

    The view 是一个被动接口,它显示数据(模型)并将用户命令(事件)路由到演示者以对该数据进行操作 .

    所以 Activity 可以充当 overall controller ,它创建 PresentersViews 并连接它们 .

    enter image description here

    如果我们谈论您的问题,是的,您可以在片段中注册演示者 . 但是,您应该避免在用作视图的片段中创建演示者 .

    但是有关于Android社区中MVP模式的不同方法的're lot'如下所示 . https://plus.google.com/communities/114285790907815804707

    为什么活动不是ui元素? http://www.techyourchance.com/activities-android/

相关问题