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

时间:2019-04-03 16:33:34

标签: java c# android xamarin xamarin.android

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

现在,我正在Button中通过Configuration Fragment实现应用程序主题更改。为此,我使用方法Activity.Recreate ();来更改主题,并且配置片段的数据与相同的数据一起保留,并且应用程序的主题也发生了完全变化,但是片段BackStack消失了,这是为什么当按下“后退”按钮时,它离开了应用程序,而不是让我回到访问Configuration Fragment的“片段”或“上一个活动”。

维护我的Activity后退的最佳方法是什么?这可能吗?

重要::仅当调用Activity.Recreate();时,因为如果以其他方式破坏了Activity,我不希望BackStack退回,我希望我的Activity干净< / em>。

其他:

  • 我的应用程序的方向设置为人像模式
  • 我的活动的launchModesingleTask,对于我正在做的应用程序类型,它必须是{}。

1 个答案:

答案 0 :(得分: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);
}

official guide 用于保存UI状态

  

onSaveInstanceState方法可帮助您生存   配置更改和系统启动的进程终止。   link