如何确定从后台堆栈中恢复的碎片
一直在寻找这个问题一段时间无济于事:
如何确定从后台堆栈中恢复碎片? 我在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