Aru*_*n C 14 android android-fragments fragmentmanager
在Android应用程序中 -
说我在Activity- MyActivity,一次Fragment举行一个.
首先我将片段A加载到它(没有标签我将它添加到后面的堆栈中FragmentManager)
然后在某些时候我加载片段B(再次没有标签我把它添加到后面的堆栈FragmentManager)
然后在某些时候我加载了片段C(再次没有标签我把它添加到后面的堆栈FragmentManager)
我popBackStack()用来启用后退按钮行为,所以每当我从Fragment C按回来时,流程就像:
片段C - > 片段B - > 片段A - > 关闭MyActivity ..
一切都很完美:-)
但如果我在片段C中并且应用程序在后台被杀死(我在 "设置"中使用了"不要保留活动标志")
并在线返回 Fragment C加载到MyActivity中
但是FragmentManager后面的堆栈只包含Fragment C ..
后退按钮搞砸了
片段C - > 关闭MyActivity ..
为什么会这样?
如何正确恢复FragmentManager一个Activity?
尝试在root活动上使用alwaysRetainTaskState.Android会自动清除Activity backstack,因为它假设您使用该应用程序已经很长时间了,并且用户想要从一开始就重新开始.
<activity android:alwaysRetainTaskState="true"/>
Run Code Online (Sandbox Code Playgroud)
此设置将阻止该行为,并且可能遵循片段管理器继承行为.
在开发您的应用程序时,我建议您使用 ADB 测试活动、片段的恢复/保存状态:
这样您就可以调试保存/恢复状态。
如果您没有复杂的应用程序,我建议您在活动中处理保存/恢复状态:
private Fragment1 mFragment;
@Override
protected void onCreate(Bundle savedState) {
super.onCreate(savedState);
// ...
if (savedState == null) {
mFragment = new Fragment1();
getFragmentManger().beginTransacation().add(mFragment, TAG).addToBackStack(TAG).commit();
}
else {
mFragment = getFragmentMananager().findFragmentByTag(TAG);
}
}
Run Code Online (Sandbox Code Playgroud)
如果您有多个Fragments或一个ViewPager或嵌套的片段,那么事情会变得非常复杂。我建议您重新启动整个应用程序:
@Override
protected void onCreate(Bundle savedState) {
super.onCreate(savedState);
if (savedState != null) {
Intent intent = new Intent(ActivityMain.this, ActivityMain.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
return;
}
}
Run Code Online (Sandbox Code Playgroud)
如果你想处理每个保存/恢复状态,请阅读这篇文章:http : //www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html
| 归档时间: |
|
| 查看次数: |
7241 次 |
| 最近记录: |