如何确定从后台堆栈中恢复的碎片

一直在寻找这个问题一段时间无济于事:

如何确定从后台堆栈中恢复碎片? 我在FragmentActivity中使用兼容性库和ListFragment。 当选择ListFragment内的项目时,将启动一个新的Fragment来替换ListFragment。

我注意到,当FragmentActivity被暂停时,Fragment的onSaveInstanceState被调用。 但是当Fragment通过FragmentTransaction被放入后端堆栈时,onSaveInstanceState不会被调用,那么onCreateView和onActivityCreated的生命周期方法将被调用,并且使用null savedInstanceState Bundle。

我这样问,是因为我想在创建或恢复碎片时加载一些数据,但当用户回来时却不是这样。 堆栈中。

我看过如何检查Fragment是否从一个后台恢复? 但希望增加更多细节,希望这会激起一个答案。

编辑:刚注意到http://developer.android.com/reference/android/app/Fragment.html#onSaveInstanceState(android.os.Bundle)说

但请注意:此方法可能在onDestroy()之前的任何时候被调用。 有很多情况下,碎片可能大部分被拆除(例如,当放置在背堆栈上而没有UI显示时),但是它的状态不会被保存直到其拥有的活动实际上需要保存其状态。

所以onSaveInstanceState绝对不是问题...


我认为最简单的方法是例如在onViewCreated()方法中执行此操作:

if (savedInstanceState == null && !mAlreadyLoaded) {
    mAlreadyLoaded = true;

    // Do this code only first time, not after rotation or reuse fragment from backstack
}

因为当android在堆栈上放置碎片时,它只会销毁它的视图,但不会终止它本身,所以当从backstack恢复碎片时,mAlreadyLoaded仍然是真的。


getSupportFragmentManager().addOnBackStackChangedListener(new OnBackStackChangedListener() {    
            public void onBackStackChanged() {
                Log.i(TAG, "back stack changed ");
                int backCount = getSupportFragmentManager().getBackStackEntryCount();
                if (backCount == 0){
                                   // block where back has been pressed. since backstack is zero.
                }
            }
        });

使用这个addOnBackStackChangedListener。


当一个片段去反向堆栈onDestroyView()调用。 不是onDestroy()

当一个片段从后台堆栈onCreateView()调用时弹出。 不是onCreate()

所以添加一个boolean mIsRestoredFromBackstack来进行分片并按照如下所示进行操作:

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    mIsRestoredFromBackstack = false;
}

@Override
public void onResume()
{
    super.onResume();
    if(mIsRestoredFromBackstack)
    {
        // The fragment restored from backstack, do some work here!
    }
}

@Override
public void onDestroyView()
{
    super.onDestroyView();
    mIsRestoredFromBackstack = true;
}
链接地址: http://www.djcxy.com/p/58695.html

上一篇: How to determine fragment restored from backstack

下一篇: Wrong values in range slider with jQuery UI