调用Activity.Recreate()后,维护Activity的后台堆栈的最佳方法是什么?

问题描述 投票:1回答:1

我有一个Activity处理许多Fragments,并且,对于backstack管理,我有一个自定义堆栈,我管理显示/隐藏Fragments。我的代码和导航工作完美。

现在,我正在通过Button中的Configuration Fragment实现应用程序主题更改。为此,我使用方法Activity.Recreate ();来更改主题,并且配置片段的数据保留了相同的数据,并且应用程序的主题完美地改变,但是碎片的BackStack消失了,原因是,当按下时后退按钮,它离开应用程序,而不是将我发回到片段或以前的活动,从我访问Configuration Fragment

维护我的活动的后台堆栈的最佳方法是什么?这个有可能?

重要提示:只有在调用Activity.Recreate();时,因为如果Activity被任何其他方式破坏,我不希望BackStack返回,我希望我的Activity清理干净。

额外:

  • 我的应用程序的方向设置是纵向模式。
  • 我的Activity的launchModesingleTask,对于我正在进行的应用程序类型必须如此。
java c# android xamarin xamarin.android
1个回答
1
投票

来自onCreate文档和this回答。

将以下逻辑添加到您的代码中:

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

© www.soinside.com 2019 - 2024. All rights reserved.