Android 许多碎片的实例

Android 许多碎片的实例,android,android-fragments,Android,Android Fragments,我有一个关于片段的活动: onCreate() { getSupportFragmentManager().beginTransaction() .add(R.id.container, PostsGaleryFragment.newInstance(), FRAGMENT_TAG).addToBackStack("home") .commit(); } 在用户操作后,我调

我有一个关于片段的活动:

onCreate()
{
     getSupportFragmentManager().beginTransaction()
                            .add(R.id.container, PostsGaleryFragment.newInstance(), FRAGMENT_TAG).addToBackStack("home")
                            .commit();
}
在用户操作后,我调用:

public void onShowPostRequested(ShowPost pShowPost)
{
    SinglePostFragment singlePostFragment = SinglePostFragment.newInstance(pShowPost.getPostId());

    getSupportFragmentManager().beginTransaction()
            .replace(R.id.container, singlePostFragment, FRAGMENT_TAG)
            .addToBackStack(null)
            .commit();
}
然后可以向后导航到主页:

@Override
public void onBackPressed()
{
    FragmentManager supportFragmentManager = getSupportFragmentManager();
    if (supportFragmentManager.getBackStackEntryCount() > 0)
    {
        supportFragmentManager.popBackStack();
    } else
    {
        super.onBackPressed();
    }

}
问题:

“home”
Fragment
有多个实例。这对我来说并不好,因为这些片段中的每一个都保留了大量对相当大的位图的引用,而且在角落后面还有一个OOM错误

问题:

为什么在
.popBackStack()
之后不使用片段的旧实例?
我临时做了一个类似singleton模式的解决方案-目前还可以,但是有什么缺点我应该注意吗?

我想你缺少的是检查是否存在保存状态,请尝试以下相同的方法

if (savedInstanceState == null) {                     
getSupportFragmentManager().beginTransaction()
                            .add(R.id.container, PostsGaleryFragment.newInstance(), FRAGMENT_TAG).addToBackStack("home")
                            .commit();
}

使用替换而不是添加。或者删除片段onDestroy()使用supportFragmentManager.popbackbackback(“home”);还要检查onCreate上的savedInstanceState===null这是这里的问题之一,但不幸的是不是正确的问题-我正在测试它,没有更改配置,无论如何,谢谢。
    onCreate()
    {
       FragmentManager fm = getSupportFragmentManager();
       PostGalleryFragment f = fm.findFragmentByTag(FRAGMENT_TAG);
       if(f == null) {
         f = fm.beginTransaction().add(R.id.container, 
                   PostsGaleryFragment.newInstance(), FRAGMENT_TAG).commit();
   }