对Fragment的许多实例

时间:2015-06-12 15:53:11

标签: android android-fragments

我有一个片段活动:

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()之后没有使用旧的Fragment实例? 我暂时用一些类似单身模式的解决方法 - 现在可以正常工作,但是我应该注意哪些缺点?

2 个答案:

答案 0 :(得分:1)

我猜你错过的是检查onSavedInstance,尝试如下

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

答案 1 :(得分:1)

    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();
   }