【问题标题】:Using ViewPager caches Fragments after screen rotation?屏幕旋转后使用 ViewPager 缓存片段?
【发布时间】:2011-11-20 21:11:09
【问题描述】:

我最初在 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);
}

【问题讨论】:

    标签: android android-widget


    【解决方案1】:

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

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

    【讨论】:

    • 如何设置fragment id?我正在使用getSupportFragmentManager().findFragmentById,但我不知道如何设置片段 ID。这是我的问题:stackoverflow.com/questions/11134926/…
    • ViewPagerAdapter源码,它会自动设置标签,你不用自己做。
    • 好的,那我怎么知道这些标签呢?
    • 从你的适配器获取片段实例并调用getTag()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-04
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多