首先,我的解决方案包括: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
新Presenter
每添加一个新的Fragment
实例将被创建。片段可以被连接/分离,它的视图可以被创建/销毁几次,不需要做任何事情,仍然得到它的Presenter
。
因为在娱乐的情况下(例如通过旋转)Fragment
S'onCreate
是Activity
■一个叫之前(其中FragmentLifecycleCallbacks
注册侦听!),听者无法实现onFragmentCreated
,它必须是onFragmentActivityCreated
。
对于给定的新Fragment
实例,然后我们就可以判断这是需要Presenter
:
private void createPresenter(Fragment fragment) {
if (fragment instanceof WhateverContract.View) {
WhateverContract.Presenter whateverPresenter =
new WhateverPresenter((WhateverContract.View) fragment);
} else if (...){}
}
的Presenter
连接在构造
private final WhateverContract.View mView;
public WhateverPresenter(@NonNull WhateverContract.View view) {
mView = checkNotNull(view, "view cannot be null!");
mView.setPresenter(this);
}
其View
/Fragment
,然后可以在开始Fragment
s onResume
。
如果有什么问题或改进,请让我知道:)
我想在android系统视图创建因为活动/片段的生命周期只是演示。所以你应该从viewpager中移除初始化到片段本身 –
所以管理演示者的生命周期以及片段生命周期 –
有道理......但是我想看看是否还有其他方法来解耦演示者初始化从片段 – vkislicins