当我旋转屏幕时,片段被销毁并返回到活动,活动打开了该片段。但他为什么要这么做呢?

问题描述 投票:0回答:3

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

你有什么假设?

java android android-fragments android-activity rotation
3个回答
4
投票

为什么会出现这种情况?

默认行为,Activity 会在方向更改时重新创建,因此您的片段也是如此。

解释

您需要了解活动生命周期才能理解为什么会发生这种情况。

enter image description here

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

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

现在您有以下选择 -

  1. AndroidManifest.xml

    修复应用程序的方向

但显然这对于用户来说并不是一个很好的体验。

  1. 使用
    onSaveInstanceState()
  2. 保存 ActivityState

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

在 Activity 中集成 Fragment,因为 Activity 正在 destroy(),所以您的 Fragment 也会 destroy() 并被重新创建。

enter image description here

请仔细阅读处理配置更改这个

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

快乐编码!


1
投票

这是因为每次旋转屏幕时都会调用

onCreate
。可能您正在通过
The Main Fragment
方法显示
onCreate
。如果您将片段显示逻辑放在
onResume
中,您将面临同样的问题,因为在onCreate之后,onResume被调用。

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


0
投票

你可以简单地这样做。 android:configChanges =“方向”。 在您的manifest.xml 文件中,将configChanges 作为方向添加到您的活动中。 例如,

 <activity
        android:name=".Activities.HomeActivity"
        android:configChanges="orientation"
        android:exported="false"/>
© www.soinside.com 2019 - 2024. All rights reserved.