我有一个Activity
处理许多Fragments
,并且,对于backstack
管理,我有一个自定义堆栈,我管理显示/隐藏Fragments
。我的代码和导航工作完美。
现在,我正在通过Button
中的Configuration Fragment
实现应用程序主题更改。为此,我使用方法Activity.Recreate ();来更改主题,并且配置片段的数据保留了相同的数据,并且应用程序的主题完美地改变,但是碎片的BackStack消失了,原因是,当按下时后退按钮,它离开应用程序,而不是将我发回到片段或以前的活动,从我访问Configuration Fragment
。
维护我的活动的后台堆栈的最佳方法是什么?这个有可能?
重要提示:只有在调用Activity.Recreate();
时,因为如果Activity被任何其他方式破坏,我不希望BackStack返回,我希望我的Activity清理干净。
额外:
launchMode
是singleTask
,对于我正在进行的应用程序类型必须如此。将以下逻辑添加到您的代码中:
public void onCreate(Bundle savedInstanceState) {
if (savedInstanceState == null) {
// savedInstanceState will be null only when creating the activity for the first time
backstack = new BackStack(); //init your backstack
} else {
// there is a chance that your backstack will be already exists at this point
// if not:
// retrieve the backstack with savedInstanceState.getSerializable("stack")
}
}
在调用recreate()
之前,在更改主题时清除堆栈
// changing theme detected
bacstack.clear();
backstack = null;
recreate();
要在活动的销毁(onDestroy)和娱乐(onCreate)之间保存堆栈,请使用此方法:
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
if (backstack != null) // the check isn't necessary, you can just put a null in the bundle
outState.putSerializable("stack", backstack);
}
用于保存UI状态的official guide
onSaveInstanceState
方法可帮助您的活动生存配置更改和系统启动的进程死亡。 link