将片段的实例保留在FragmentPagerAdapter中

3

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 这样的事情,以便获得对片段的引用。

1个回答

8

这种方法的问题在于,即使你保留了一个引用,FragmentManager仍然可能会创建新的fragment实例。在这种情况下,相同fragment的多个实例将存在于内存中(泄漏),而您保留的引用指向的实例甚至可能不会被显示。因此,换句话说,这是不安全的。

然而,安全的方法是在您的fragment中保留对activity的引用。

在您的fragment中,您可以重写

@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管理的片段实例的引用。然而,我更喜欢你的建议。谢谢! - Héctor Júdez Sapena

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接