在屏幕旋转后使用ViewPager缓存碎片?

时间:2011-11-20 21:11:10

标签: android android-widget

我最初在Activity onCreate()中创建我的片段。比起我创建ViewPager和设置适配器。我保留了对片段的全局引用,以便我可以根据需要更新它们。此外,适配器访问这些片段。

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

我该如何处理片段的生命周期?我需要能够直接调用活动中的片段。片段的单例是一个好主意吗?或者只是一个记忆泄漏者?

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);
}

1 个答案:

答案 0 :(得分:5)

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

您可能需要显示更多代码,但只要您在onCreate()中创建片段,引用就应该在活动的生命周期内有效。有关使用ViewPager的片段的更多信息,请查看兼容性库示例代码。