当我旋转屏幕时,片段被销毁并返回到 Activity,它打开了那个片段。但他为什么要这样做?

When I rotate the screen, the fragment is destroyed and returned to Activity, which opened that Fragment. But why he's doing so?

我有一个 Activity 可以通过 2 个不同的按钮打开 2 个不同的片段。默认情况下 Activity 创建时,它打开一个片段,我们称之为“主片段”。 我们通过第一个按钮转到的第一个片段我们遇到了零旋转问题,但是旋转后的第二个按钮消失了并且屏幕显示了主片段的内容。当我尝试向后旋转屏幕时,我再次看到了主要片段的内容。但为什么会这样,如果我不写任何代码,那必须 return 我到 Main Fragment 而无需单击按钮。

你有什么假设?

那是因为每次旋转屏幕时都会调用onCreate。可能您正在通过 onCreate 方法显示 The Main Fragment。如果将片段显示逻辑放在 onResume 中,您将面临同样的问题,因为在 onCreate 之后,onResume 被调用。

解决方案:将片段存储在共享首选项的顶部,这样您就知道每次调用 onCreate 时要显示的内容。

为什么会这样?

Default Behavior, Actiivty is getting recreated on orientation change so your fragment are.

说明

您需要了解 Activity Life Cycle 才能理解为什么会发生这种情况。

首先,“旋转屏幕”并不是我们今天所说的实际场景。因为任何配置更改都会导致 Android 重新启动您的 Activity。配置更改可能是设备旋转(因为现在我们有不同的屏幕布局可以利用),或者它可能是语言切换(因为我们需要 re-write 所有这些字符串,现在可能需要更多空间或它可能是可怕的 RTL 开关!),甚至是键盘可用性。

通过重新加载您的应用程序,系统实际执行的操作是调用 onDestroy(),然后立即调用 onCreate()。这样,您的 Activity 就会尽可能新鲜,并具有所有正确的创建数据(即使用户一直与您在一起)。

现在您有以下选项 -

  1. AndroidManifest.xml

    中为您的应用修复方向

但很明显,这对用户来说不是很好的体验。

  1. onSaveInstanceState()
  2. 保存 activity 状态

这个方法会在onDestroy()之前被调用。而且,当你的 Activity 创建时,有一个匹配的步骤 onRestoreInstanceState() ,它也会被自动调用。所有这些自动步骤意味着您可以让系统担心保存和加载您的数据,因为您提前计划并制定了重要事项。 (或者,您可以跳过 onRestoreInstanceState() 并从 onCreate() 附带的 Bundle 中加载您保存的状态。

在 activity 中集成 Fragment,因为 activity 正在使用 destroy(),因此您的片段也将 destroy() 并重新创建。

请好好阅读Handling Configuration Change and this

一旦你理解了这些概念,事情就会开始落入你的脑海,但只有当你完成你的学习曲线时,它才会发生。

编码愉快!