提问人:Dan 提问时间:8/28/2012 更新时间:8/28/2012 访问量:9275
分离未触发 onSaveInstanceState() 的 Fragment
Detaching a Fragment not triggering onSaveInstanceState()
问:
我的 Android 应用程序有一个变化,它占据了一定的 .我正在尝试在选项卡更改时保存 Fragment 的状态,以便可以在 .ActionBar
Fragment
FrameLayout
onSaveInstanceState
onCreateView
问题是,从来没有被调用过。调用 's 和 方法,但提供的 to 保持为 null。onSaveInstanceState
Fragment
onDestroyView
onCreateView
Bundle
onCreateView
有人可以向我解释实际调用的时间,我如何确保在切换选项卡时调用它,或者在分离和重新连接时保存和恢复状态的最佳实践?onSaveInstanceState
Fragment
片段:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.event_log, container, false);
// Retrieve saved state
if (savedInstanceState != null){
System.out.println("log retrieved");
} else {
System.out.println("log null");
}
return view;
}
@Override
public void onSaveInstanceState(Bundle outState) {
System.out.println("log saved");
super.onSaveInstanceState(outState);
// more code
}
活动:
/**
* Detach the current Fragment, because another one is being attached.
*/
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
if (tab.getText().equals(getString(R.string.tab_events))){
if (frEventLog != null) {
ft.detach(frEventLog);
}
}
答:
Fragment#onSaveInstanceState
仅当主机被销毁时才调用,并且您有可能返回到相同的活动,并且片段仍被添加到 .最常见的情况是屏幕旋转。Activity
Fragment
FragmentManager
例如,我认为您还需要执行setRetainInstance(true)。
不过不太确定这一点。Fragment
onCreate
例如,当您按下主页按钮时,您还应该看到正在调用此方法。这将破坏活动,但您可以使用任务列表返回该活动。
如果你只是碎片,你需要做的就是把它拿回来。detach()
FragmentManager
您应该查看两个示例:
ActionBar
FragmentTabs 和 TabHost
FragmentTabs
该示例使用TabHost
ft.add(containerId, fragment, tag);
// later
fragment = mActivity.getSupportFragmentManager().findFragmentByTag(tag);
要查找以前添加的 S 的实例,请一直工作到您Fragment
remove()
Fragment
关于 / :一旦片段分离,就会调用它,因为下次附加它时需要创建一个新的 .请注意,当您 fragment 时不会调用它,因为它仍然附加到 .它仅与视图层次结构分离。onCreateView
onDestroyView
View
Fragment#onDetached()
detach()
Activity
关于如何保留片段状态/如何使用片段在 Android 培训 - 缓存位图中保留状态,还有另一个很好的例子。
不过,这个例子缺少一个关键行:
public static RetainFragment findOrCreateRetainFragment(FragmentManager fm) {
RetainFragment fragment = (RetainFragment) fm.findFragmentByTag(TAG);
if (fragment == null) {
fragment = new RetainFragment();
fm.beginTransaction().add(fragment, TAG).commit(); // << add this
}
return fragment;
}
评论
OnCreate
下一个:用 C++ 编写 PNG
评论