首先,我的解决方案包括FragmentManager.FragmentLifecycleCallbacks,这是一个
用于监听给定 FragmentManager 中发生的片段状态变化的回调接口
并坚持关注点分离,我想说的是Android Architecture Blueprints 中显示的方式。
-
Activity 创建 Presenter,传递 View/ Fragment,这样
-
Presenter 知道它的 View 并设置自己的 Presenter
在Activity 的onCreate 中,我通过调用此函数注册了一个FragmentLifecycleCallbacks 侦听器
private void registerFragmentsLifecycleListener() {
// All registered callbacks will be automatically unregistered when
// this FragmentManager is destroyed.
getSupportFragmentManager.registerFragmentLifecycleCallbacks(
new FragmentManager.FragmentLifecycleCallbacks() {
// Called after the fragment has returned from its onActivityCreated
@Override
public void onFragmentActivityCreated(FragmentManager fm, Fragment f,
Bundle savedInstanceState) {
createPresenter(f);
}
}, false); // true to register callback for all child FragmentManagers
}
在Fragment 从其onActivityCreated 返回后,侦听器会收到通知,以确保只有ViewPager 添加的每个新 Fragment 实例都有一个新的Presenter将被创建。片段可以被附加/分离,它的视图可以被创建/销毁几次,不需要做任何事情,仍然得到它的Presenter。
因为在娱乐的情况下(例如通过旋转)Fragments'onCreate 在Activitys 之前调用(FragmentLifecycleCallbacks 侦听器已注册!),侦听器无法实现 @ 987654344@,必须是onFragmentActivityCreated。
对于给定的新Fragment 实例,我们可以确定需要哪个Presenter:
private void createPresenter(Fragment fragment) {
if (fragment instanceof WhateverContract.View) {
WhateverContract.Presenter whateverPresenter =
new WhateverPresenter((WhateverContract.View) fragment);
} else if (...){}
}
Presenter 在构造函数中与其View/Fragment 连接
private final WhateverContract.View mView;
public WhateverPresenter(@NonNull WhateverContract.View view) {
mView = checkNotNull(view, "view cannot be null!");
mView.setPresenter(this);
}
然后可以在FragmentsonResume启动。
如果有问题或需要改进,请告诉我:)