1

我正在使用 FragmentPagerAdapter 来实现选项卡式界面。我的第 0 个片段在创建时创建了一个加载器,并尝试在 onActivityCreated() 中重新连接到加载器。这是课程:

public class My0thFragment extends Fragment {
    private boolean ranOnce = false;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true); 
    }

    @Override
    public void onActivityCreated() {
        if (!ranOnce) {
            // if the first time we're being created, do an initial load of data.
            getLoaderManager().initLoader(500, null, mMyCallback).forceLoad();
            ranOnce = true;
        } else {
            // reconnect?
            getLoaderManager().initLoader(500, null, mMyCallback);

            // sanity check.
            printAllLoaders(getLoaderManager());
        }
    }

    private LoaderManager.LoaderCallbacks<Foo> mMyCallback = new LoaderManager.LoaderCallbacks<Foo>() {
        @Override
        public Loader<Foo> onCreateLoader(int arg0, Bundle arg1) {
            return new FooLoader(getActivity(), arg1);
        }

        @Override
        public void onLoadFinished(Loader<Foo> arg0, Foo arg1) {
            Log.e(tag, "onLoadFinished()!");
        }

        @Override
        public void onLoaderReset(Loader<Foo> arg0) {
            Log.e(tag, "onLoaderReset()!");
        }
    };
}

这是场景:

  1. App启动,在FragmentPagerAdapter中创建了第0个fragment。
  2. 调用 onActivityCreated() 方法,该方法在第一次运行时创建并启动加载程序。
  3. 在加载程序完成之前,我快速切换到另一个选项卡。
  4. 我可以通过日志看到加载程序完成,但我的回调永远不会得到 onLoadFinished() 回调。我认为这是因为片段处于某种分离状态,具体取决于 FragmentPagerAdapter 的工作方式。
  5. 返回到第 0 个选项卡,我看到 onActivityCreated() 被调用,并且再次调用了 initLoader() 方法。回调仍然没有触发。
  6. 此时我可以打印加载器管理器中的所有加载器,并看到我的加载器仍然坐在加载器管理器中。

所以我被困在这里,我一定做错了什么,因为加载器的东西必须是为我们开发人员考虑到片段生命周期而设计的。谁能指出我在这里做错了什么?

谢谢

4

3 回答 3

6

可能你有同一个片段的两个实例,尝试在销毁片段上销毁加载器:

protected void onDestroy() {
   if (getSupportLoaderManager().getLoader(0) != null) {
            getLoaderManager().getLoader(0).abandon();
            getSupportLoaderManager().destroyLoader(0);
    }
    super.onDestroy();
}
于 2012-10-13T08:02:42.980 回答
2

不知道你是否解决了你的问题,但你应该在 Fragment.onStart() 上调用 forceLoad() 而不是 Fragment.onActivityCreated()。

myCallback.onLoadFinished() 永远不会被调用,因为在您的片段启动之前,您的“myCallback”实际上并未附加到加载器。

于 2012-08-28T17:43:01.210 回答
0

请参阅 API Demos 或 Support4Demos 中的示例代码文件FragmentTabsPager.java。它提供了一个 ViewPager 和一个 TabHost 来控制同一组 Fragment。我破解了它以准确涵盖您描述的情况。(你是直接联系我的吗?)需要注意的主要是示例应用程序没有分离 ViewPager 中的 Fragments。

这是我破解它的部分:

    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mTabHost = (TabHost)findViewById(android.R.id.tabhost);
    mTabHost.setup();

    mViewPager = (ViewPager)findViewById(R.id.pager);

    mTabsAdapter = new TabsAdapter(this, mTabHost, mViewPager);

    mTabsAdapter.addTab(mTabHost.newTabSpec("fraga").setIndicator("Fragment A"),
            FragmentA.class, null);
    mTabsAdapter.addTab(mTabHost.newTabSpec("fragb").setIndicator("Fragment B"),
            FragmentB.class, null);

    if (savedInstanceState != null) {
        mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab"));
    }

}

片段 A 是包含加载程序的片段。

于 2012-05-09T09:13:11.320 回答