我的代码有一个Activity,它有一个FragmentPagerAdapter,可以根据需要创建'n'个片段。 Activity有一个加载器,每个片段都有自己的加载器。所有装载机都有唯一的ID。 (Activity的加载器实际上决定了适配器中的Pages数量)
我一直在这里和那里得到这个警告,不能指责导致它的原因。 它似乎并不重要,也看着LoaderManger的代码抛出这个警告,但仍然 - 警告通常是错误的迹象..
最初使用FragmentStatePagerAdapter然后转移到FragmentPagerAdapter,认为这可能是某种问题 - 但显然不是。
发布代码会使这一点变得复杂并且添加很少。
有什么想法吗?
答案 0 :(得分:15)
在initActivityCreated方法中移动你的initLoader方法。
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
LoaderManager lm = getLoaderManager();
lm.initLoader(LOADER_ID, null, this);
}
答案 1 :(得分:4)
我刚刚与支持库完成了几个小时的调试会议。
TL; DR:请勿在{{1}}中致电getLoaderManager
,使用onActivityCreated
!
(这意味着您无法在Fragment.onCreate
之前)initLoader
onActivityCreated
会懒散地从活动中获取Fragment.getLoaderManager()
个实例。然而,为了使其成为有效的片段,必须激活片段(LoaderManager
),这意味着这里有两件事情:
FragmentManager.makeActive
)FragmentManager.addFragment
)mWho
来电makeActive
)后者非常重要,因为当您致电Fragment.setIndex
时,Fragment.getLoaderManager()
会要求FragmentActivity.getLoaderManager(who, ...)
提供真正的经理。从Fragment.onCreate()
拨打makeActive
来电时,LoaderManagerImpl
来电还没有发生,所以你会找回mWho == null
LoaderManager
这是不好的,因为该框架将会将LoaderManager
实例重新分配给具有相似生命周期的每个片段。
由于这个重新分配,mWho
已经由一个片段启动,但是另一个片段也会尝试启动它,因为活动不知道哪个片段在询问,它们都没有他们的身份({{1}})。