将片段实例保留在FragmentPagerAdapter中

时间:2012-12-03 14:16:06

标签: android android-fragments fragmentpageradapter

是否可以在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之类的事情以获得对片段的引用。

1 个答案:

答案 0 :(得分:8)

该方法的问题在于即使您维护引用,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);

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