Android旋转:为什么片段不能被TAG恢复?

问题描述:

我有一个名为MainActivity的活动,里面有一个名为“HomeFragment”的片段。我想在屏幕旋转后恢复片段,但有些东西似乎丢失了。 我采取了以下过程:Android旋转:为什么片段不能被TAG恢复?

  1. 节省使用getSupportFragmentManager().putFragment(...)片段中onSaveInstanceState
  2. 尝试通过fragmentManager.findFragmentByTag的onCreate期间恢复片段(检查包后不为空)

然而findFragmentByTag返回null。

这里是代码片段里面MainActivity:

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     // Set up the action bar to show a dropdown list. 
     final ActionBar actionBar = getSupportActionBar(); 
     actionBar.setDisplayShowTitleEnabled(false); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); 
     setupNavigationSpinner(actionBar); 
     FragmentManager fragmentManager = getSupportFragmentManager(); 

     if (savedInstanceState != null) { 

      if (fragmentManager.findFragmentByTag("frag") != null) { 
       // findFragmentByTag always return null 
       homeFragment = (HomeFragment) fragmentManager 
         .findFragmentByTag(HomeFragment.ARG_ITEM_ID); 
       contentFragment = homeFragment; 
      }else{ 
       homeFragment = new HomeFragment(); 
       switchContent(homeFragment, HomeFragment.ARG_ITEM_ID); 
      } 
     } else { 
      homeFragment = new HomeFragment(); 
      switchContent(homeFragment, HomeFragment.ARG_ITEM_ID); 
     } 

} 


@Override 
public void onSaveInstanceState(Bundle outState) { 
    getSupportFragmentManager().putFragment(outState, "frag",homeFragment); 
} 

public void switchContent(Fragment fragment, String tag) { 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    while (fragmentManager.popBackStackImmediate()) 
     ; 

    if (fragment != null) { 
     FragmentTransaction transaction = fragmentManager 
       .beginTransaction(); 
     transaction.replace(R.id.content_frame, fragment, tag); 
     // Only ArticlDetailFragment is added to the back stack. 
     if (!(fragment instanceof Fragment)) { 
      transaction.addToBackStack(tag); 
     } 
     transaction.commit(); 
     contentFragment = fragment; 
    } 
} 
+0

由于某种原因,我遇到了同样的问题。 – 2014-10-04 12:53:29

+0

呃......你可能想向我们展示'switchContent'中发生了什么。 – 2014-10-04 14:01:49

+0

@PaulBurke更新 – VSB 2014-10-04 14:03:18

没有理由叫

getSupportFragmentManager().putFragment(outState, "frag",homeFragment); 

一个Fragment状态将自动恢复。问题是你没有叫你的onSaveInstanceState超级。它应该只是看起来像这样:

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
} 

此外,你设置的标签作为HomeFragment.ARG_ITEM_ID然后找"frag"HomeFragment.ARG_ITEM_ID == "frag"

+0

我只是将键改为“FRAG”来检查可能的错误,然而正如你注意到的主要问题是关于调用'super.onSaveInstanceState(outState)';' – VSB 2014-10-04 14:24:07

+0

@VSB好。 :-)如果它解决了你的问题,请记住接受这个答案。 – 2014-10-04 14:26:59