我有一个 Activity,可以通过 2 个不同的按钮打开 2 个不同的 Fragments。默认情况下,Activity 在创建时会打开一个 Fragment,我们称之为“主 Fragment”。 我们通过第一个按钮转到的第一个片段在旋转方面遇到了零问题,但是旋转消失后的第二个片段并且屏幕显示了主片段的内容。当我尝试向后旋转屏幕时,我再次看到主片段的内容。但为什么会这样,如果我没有编写任何代码,那么我必须在不单击按钮的情况下返回主片段。
你有什么假设?
为什么会出现这种情况?
默认行为,Activity 会在方向更改时重新创建,因此您的片段也是如此。
解释
您需要了解活动生命周期才能理解为什么会发生这种情况。
首先,“旋转屏幕”并不是我们今天讨论的实际场景。因为任何配置更改都会导致Android重新启动您的Activity。配置更改可能是设备旋转(因为现在我们有不同的屏幕布局可供使用),也可能是语言切换(因为我们需要重新编写所有这些字符串,这可能需要更多空间,或者可能是可怕的 RTL 开关!),甚至是键盘可用性。
通过重新加载您的应用程序,系统实际上正在执行的是调用 onDestroy(),然后立即调用 onCreate()。这样,您的 Activity 就尽可能新鲜,并具有所有正确的创建数据(即使用户一直与您在一起)。
现在您有以下选择 -
从
AndroidManifest.xml
修复应用程序的方向
但显然这对于用户来说并不是一个很好的体验。
onSaveInstanceState()
该方法会在 onDestroy() 之前调用。而且,当你的 Activity 创建时,有一个匹配的步骤 onRestoreInstanceState(),它也会被自动调用。所有这些自动步骤意味着您可以让系统负责保存和加载数据,因为您提前计划并规划出了重要的内容。 (或者,您可以跳过 onRestoreInstanceState() 并从 onCreate() 附带的 Bundle 加载保存的状态。
在 Activity 中集成 Fragment,因为 Activity 正在 destroy(),所以您的 Fragment 也会 destroy() 并被重新创建。
一旦您理解了这些概念,事情就会开始落入您的掌握,但只有当您完成学习曲线时才会发生。
快乐编码!
这是因为每次旋转屏幕时都会调用
onCreate
。可能您正在通过 The Main Fragment
方法显示 onCreate
。如果您将片段显示逻辑放在onResume
中,您将面临同样的问题,因为在onCreate之后,onResume被调用。
解决方案:将片段存储在共享首选项中,这样您就知道每次调用 onCreate 时要显示什么。
你可以简单地这样做。 android:configChanges =“方向”。 在您的manifest.xml 文件中,将configChanges 作为方向添加到您的活动中。 例如,
<activity
android:name=".Activities.HomeActivity"
android:configChanges="orientation"
android:exported="false"/>