首先,我的解决方案FragmentManager.FragmentLifecycleCallbacks包括
用于监听给定 FragmentManager 中发生的片段状态变化的回调接口
并坚持关注点的分离,我想说的是Android Architecture Blueprints中显示的方式。
Activity创建Presenter,传递View/ Fragment,这样
Presenter知道它View,而且把自己定为它的Presenter
在Activity'sonCreate我通过调用这个来注册一个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以确保仅创建由a new添加的每个新 Fragment实例。片段可以被附加/分离,它的视图可以被创建/销毁几次,不需要做任何事情,仍然得到它的.ViewPagerPresenterPresenter
因为在娱乐的情况下(例如通过旋转),Fragments'在 sonCreate之前被调用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连接ViewFragment
private final WhateverContract.View mView;
public WhateverPresenter(@NonNull WhateverContract.View view) {
mView = checkNotNull(view, "view cannot be null!");
mView.setPresenter(this);
}
然后可以在Fragments中启动onResume。
如果有什么问题或需要改进,请告诉我:)