Android旋转:为什么片段不能被TAG恢复?
我有一个名为MainActivity的活动,里面有一个名为“HomeFragment”的片段。我想在屏幕旋转后恢复片段,但有些东西似乎丢失了。 我采取了以下过程:Android旋转:为什么片段不能被TAG恢复?
- 节省使用
getSupportFragmentManager().putFragment(...)
片段中onSaveInstanceState
- 尝试通过
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;
}
}
没有理由叫
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"
?
我只是将键改为“FRAG”来检查可能的错误,然而正如你注意到的主要问题是关于调用'super.onSaveInstanceState(outState)';' – VSB 2014-10-04 14:24:07
@VSB好。 :-)如果它解决了你的问题,请记住接受这个答案。 – 2014-10-04 14:26:59
由于某种原因,我遇到了同样的问题。 – 2014-10-04 12:53:29
呃......你可能想向我们展示'switchContent'中发生了什么。 – 2014-10-04 14:01:49
@PaulBurke更新 – VSB 2014-10-04 14:03:18