Android 分离未触发onSaveInstanceState()的片段
我的Android应用程序有一个Android 分离未触发onSaveInstanceState()的片段,android,save,fragment,detach,Android,Save,Fragment,Detach,我的Android应用程序有一个ActionBar,可以改变Fragment占据某个FrameLayout的位置。我试图使用onSaveInstanceState保存选项卡更改时片段的状态,以便在onCreateView中恢复片段 问题是,onSaveInstanceState从未被调用。调用片段的OnTestRoyView和onCreateView方法,但提供给onCreateView的捆绑包仍为空 有人能告诉我什么时候调用了onSaveInstanceState,我如何确保在切换选项卡时调用
ActionBar
,可以改变Fragment
占据某个FrameLayout
的位置。我试图使用onSaveInstanceState
保存选项卡更改时片段的状态,以便在onCreateView
中恢复片段
问题是,onSaveInstanceState
从未被调用。调用片段
的OnTestRoyView
和onCreateView
方法,但提供给onCreateView
的捆绑包仍为空
有人能告诉我什么时候调用了onSaveInstanceState
,我如何确保在切换选项卡时调用它,或者在分离和重新连接片段时保存和恢复其状态的最佳做法吗
片段:
@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
仅在托管片段的活动
被销毁,并且您有可能返回到同一活动,并且该片段仍被添加到片段管理器
时调用。最常见的情况是屏幕旋转
我认为您的片段
也需要在onCreate
中执行。不过,对这一点并不十分确定
例如,当您按下home按钮时,您还应该看到调用此方法。这将破坏活动,但您可以使用任务列表返回到它
如果您只是detach()
片段,那么您需要做的就是向FragmentManager
索取它
有两个例子你应该看看:
及
TabHost
示例使用
ft.add(containerId, fragment, tag);
// later
fragment = mActivity.getSupportFragmentManager().findFragmentByTag(tag);
要查找先前添加的Fragment
s的实例,请一直工作到remove()
aFragment
关于onCreateView
/onestroyView
:在片段分离后调用,因为下次附加时需要创建新的视图。请注意,当detach()
片段时,不会调用Fragment#onDetached()
,因为它仍然附加到活动
。它仅与视图层次分离
还有一个关于如何在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;
}
public static RetainFragment findOrCreateRetainFragment(碎片管理器fm){
RetainFragment=(RetainFragment)fm.findFragmentByTag(TAG);
if(片段==null){
fragment=新的RetainFragment();
fm.beginTransaction().add(fragment,TAG.commit();//可能是感谢您的响应的副本。我的印象是使用setRetainInstance(true)这会占用大量内存,因为这意味着存储选项卡而不是销毁和重新创建它们,但我会尝试一下。我必须通过FragmentManager获取片段,还是可以在字段中保留对它们的引用?你根本不需要引用。FragmentManager有对它们的引用,但如果不需要,你可以添加一个添加内存泄漏。内存强度取决于您在片段中使用了多少内存,如果操作正确,内存强度可能接近0。我想,在您的第一个示例的帮助下,我现在已经解决了这个问题。我的问题实际上是,我在片段的onActivityCreated()中有一些代码方法,它实际上是重置它,因为我没有意识到这个方法会运行不止一次。是的,活动是在配置更改(如旋转)时重新创建的,并且你会再次被调用。正确把握生命周期很棘手:/OnCreate
将是一个只应该调用一次的地方。