Java 当我旋转屏幕时,片段被销毁并返回到Activity,Activity打开了该片段。但他为什么';为什么这样做?

Java 当我旋转屏幕时,片段被销毁并返回到Activity,Activity打开了该片段。但他为什么';为什么这样做?,java,android,android-fragments,android-activity,rotation,Java,Android,Android Fragments,Android Activity,Rotation,我有一个活动,它可以通过两个不同的按钮打开两个不同的片段。默认情况下,活动创建时正在打开一个片段,我们称之为“主片段”。 我们通过第一个按钮查看的第一个片段在旋转中没有遇到任何问题,但是旋转后的第二个片段消失,屏幕显示了主片段的内容。当我试图将屏幕向后旋转时,我再次看到主片段的内容。但为什么会这样,如果我没有编写任何代码,那么必须返回到主片段,而无需单击按钮 您有什么假设?这是因为每次旋转屏幕时都会调用onCreate。您可能正在显示来自onCreate方法的主片段。如果将片段显示逻辑放入onR

我有一个活动,它可以通过两个不同的按钮打开两个不同的片段。默认情况下,活动创建时正在打开一个片段,我们称之为“主片段”。 我们通过第一个按钮查看的第一个片段在旋转中没有遇到任何问题,但是旋转后的第二个片段消失,屏幕显示了主片段的内容。当我试图将屏幕向后旋转时,我再次看到主片段的内容。但为什么会这样,如果我没有编写任何代码,那么必须返回到主片段,而无需单击按钮


您有什么假设?

这是因为每次旋转屏幕时都会调用
onCreate
。您可能正在显示来自
onCreate
方法的
主片段。如果将片段显示逻辑放入
onResume
中,您将面临相同的问题,因为onCreate之后,onResume被调用


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

这是因为每次旋转屏幕时都会调用
onCreate
。您可能正在显示来自
onCreate
方法的
主片段。如果将片段显示逻辑放入
onResume
中,您将面临相同的问题,因为onCreate之后,onResume被调用


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

为什么会发生这种情况?

默认行为是,在方向更改时重新创建Activity,所以片段是

解释

你需要理解为什么会发生这种情况

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

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

现在您有以下选项-

  • AndroidManifest.xml

  • 但对于用户来说,这并不是一个很好的体验

  • 使用
    onSaveInstanceState()保存activityState
  • 此方法将在onDestroy()之前调用。并且,创建活动时,在RestoreInstanceState()上有一个匹配的步骤,该步骤也将自动调用。所有这些自动步骤意味着您可以让系统担心保存和加载数据,因为您提前计划并规划了重要的内容。(或者,您可以跳过onRestoreInstanceState()并从onCreate()附带的捆绑包中加载保存的状态

    在本例中,您将片段集成到活动中,因为活动正在获取destroy(),所以您的片段也将destroy(),并将被重新创建

    请好好读一读

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


    快乐的编码!

    为什么会发生这种情况?

    默认行为是,在方向更改时重新创建Activity,所以片段是

    解释

    你需要理解为什么会发生这种情况

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

    通过重新加载你的应用程序,系统实际上正在调用onDestroy(),然后立即调用onCreate()。这样,你的活动就尽可能新鲜,有了所有正确的创建数据(即使用户一直都在你身边)

    现在您有以下选项-

  • AndroidManifest.xml

  • 但对于用户来说,这并不是一个很好的体验

  • 使用
    onSaveInstanceState()保存activityState
  • 此方法将在onDestroy()之前调用。创建活动时,还会自动调用RestoreInstanceState()上的一个匹配步骤。所有这些自动步骤都意味着您可以让系统担心保存和加载数据,因为您提前计划并规划了重要内容。(或者,您可以跳过onRestoreInstanceState()并从onCreate()附带的捆绑包中加载保存的状态

    在本例中,您将片段集成到活动中,因为活动正在获取destroy(),所以您的片段也将destroy(),并将被重新创建

    请好好读一读

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


    快乐编码!

    谢谢你提供的信息。关于生命周期:我几乎没有问题。我经常使用这个方案。关于manifes的第一个解决方案