我最初在Activity onCreate()中创建 fragment 。然后,我将创建ViewPager并设置适配器。我保留了对 fragment 的全局引用,因此可以根据需要对其进行更新。同样,这些 fragment 也可以通过适配器访问。

我的问题是,一旦屏幕旋转,我会注意到重新创建了 fragment ,但ViewPager仍然包含创建的原始 fragment ...?

我应该如何处理 fragment 的生命周期?我需要能够直接从 Activity 中调用该 fragment 。一个 fragment 的单例是个好主意吗?还是仅仅是内存泄漏者?

protected void onCreate (Bundle savedInstanceState)
{
...
...
        // set up cards
        mFrag1 = new Frag1();
        mFrag1.setOnActionEventListener(mOnActionEvents);

        mFrag2 = new Frag2();
        mFrag3 = new Frag3();

        mFragPager = (ViewPager) findViewById(R.id.vpPager);
        mFragAdapter = new FragAdapter(getSupportFragmentManager());
        mFragPager.setAdapter(mCardAdapter);
        mFragPager.setOnPageChangeListener(mOnCardChange);
}

最佳答案

全局实例和静态 fragment 绝对不是一个好主意。除非您在 fragment 上调用setRetainInstance(),否则它将在重新创建父 Activity (在屏幕旋转等)时被序列化为Bundle并重新创建。当然,这将产生新的 fragment 实例,并且您的旧引用将无效。您应该根据需要通过FragmentManager.findFragmentById/Tag()获取对 fragment 的引用,并且绝对不要将其存储在静态变量中。

您可能需要显示更多我们的代码,但是只要您在onCreate()中创建 fragment ,这些引用就应该在 Activity 的整个生命周期内有效。检查兼容性库样本代码,以获取更多关于使用带有ViewPager的 fragment 的信息。

10-08 06:01
查看更多