Android 分离未触发onSaveInstanceState()的片段

Android 分离未触发onSaveInstanceState()的片段,android,save,fragment,detach,Android,Save,Fragment,Detach,我的Android应用程序有一个ActionBar,可以改变Fragment占据某个FrameLayout的位置。我试图使用onSaveInstanceState保存选项卡更改时片段的状态,以便在onCreateView中恢复片段 问题是,onSaveInstanceState从未被调用。调用片段的OnTestRoyView和onCreateView方法,但提供给onCreateView的捆绑包仍为空 有人能告诉我什么时候调用了onSaveInstanceState,我如何确保在切换选项卡时调用

我的Android应用程序有一个
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()
a
Fragment


关于
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
将是一个只应该调用一次的地方。