7

我的代码有一个 Activity,它有一个 FragmentPagerAdapter,它可以根据需要创建“n”个片段。Activity 有一个 loader,每个 Fragment 都有自己的 loader。所有加载程序都有唯一的 ID。(Activity的loader实际上决定了adapter中的Pages数量)

我一直在这里和那里收到此警告,无法确定是什么原因造成的。它似乎并不重要,还查看了引发此警告的 LoaderManger 的代码,但仍然 - 警告通常是错误的标志..

最初使用 FragmentStatePagerAdapter,然后移至 FragmentPagerAdapter,认为这可能是问题所在 - 但显然不是。

发布代码确实会使这复杂化并且添加的很少。

有什么想法吗?

4

2 回答 2

15

在您的片段中,将您的 initLoader 方法移动到 onActivityCreated 方法中。

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onActivityCreated(savedInstanceState);

    LoaderManager lm = getLoaderManager();
    lm.initLoader(LOADER_ID, null, this);
}
于 2013-01-31T18:15:51.103 回答
4

我刚刚用支持库完成了几个小时的调试会话。

TL;DR:不要打电话getLoaderManagerFragment.onCreate使用onActivityCreated
(这意味着您initLoader以前不能这样做onActivityCreated

Fragment.getLoaderManager()将从活动中懒惰地为您获取一个LoaderManager实例。但是,要使其成为有效的片段,必须已激活片段 ( FragmentManager.makeActive),这意味着与此处相关的两件事:

  • 已添加片段
    ( FragmentManager.addFragment)
  • Fragment 有一个内部标识符 ( mWho)
    (makeActive调用Fragment.setIndex)

后者非常重要,因为当你打电话时Fragment.getLoaderManager(),反过来又要求FragmentActivity.getLoaderManager(who, ...)真正的经理。当从调用Fragment.onCreate()makeActive调用时还没有发生,所以你会得到一个不好LoaderManagerImplmWho == null结果,因为框架会将LoaderManager实例重新分配给每个具有相似生命周期的片段。

由于这种重新分配,LoaderManager已经由一个片段启动,但另一个片段也会尝试启动它,因为活动不知道哪个片段在询问,它们都没有自己的身份(mWho)。

于 2015-03-15T01:40:30.200 回答