【问题标题】:keep instances of fragments inside FragmentPagerAdapter在 FragmentPagerAdapter 中保留片段的实例
【发布时间】:2012-12-03 14:16:05
【问题描述】:

是否可以在FragmentPagerAdapter 中保留为FragmentPagerAdapter 创建的每个片段的实例?

类似这样的:

@Override
    public Object instantiateItem(ViewGroup container, int position)
        switch(position){
        case 0:
            fragment0 = super.instantiateItem(container, position);
            return fragment0;
        case 1:
            fragment1 = super.instantiateItem(container, position);
            return fragment1;
        default:
            return super.instantiateItem(container, position);
        }
    }

我会遇到内存问题吗?

我们的想法是执行MyFragmentPagerAdapter.fragment0 之类的操作,以获取对片段的引用。

【问题讨论】:

    标签: android android-fragments fragmentpageradapter


    【解决方案1】:

    这种方法的问题是FragmentManager 可能会创建片段的新实例,即使您维护一个引用。在这种情况下,同一片段的多个实例将在内存中(泄漏),并且您维护的引用指向一个甚至可能不会显示的实例。所以换句话说,它是不安全的。

    然而,安全的是在片段中维护您的活动的引用。

    在你的片段中你覆盖

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        home = (YourFragmentActivity) activity;
    }
    
    public void onCreate(Bundle savedInstanceState) {
                home.setThisFragTag(getTag());
        }
    

    在您的 FragmentActivity 中

    public void ThisFragTag(String tag) {
        this.fragTag = tag;
    }
    

    现在在您的活动中,您可以保留当前显示的片段实例

    (YourFragmentClass) getSupportFragmentManager().findFragmentByTag(fragTag);
    

    您可以对多个片段重复此操作

    【讨论】:

    • 实际上,我认为通过我的方法,我总是保留对由 fragmentManager 管理的片段的实际实例的引用。不过我更喜欢你的建议。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多