当前位置: 首页 > 知识库问答 >
问题:

使用Fragment的setRetainInstance(true)真的是处理旋转变化的好方法吗

东郭俊楠
2023-03-14

我指的是为什么使用碎片#html" target="_blank">setRetainInstance(布尔值)?

我这样要求的原因是活动要处理轮换,官方活动文档鼓励我们让活动在轮换期间关闭并重新启动。

android:configChanges列出活动将自行处理的配置更改。在运行时发生配置更改时,默认情况下会关闭并重新启动活动,但使用此属性声明配置将阻止重新启动活动。相反,活动将保持运行,并调用其onConfigurationChanged()方法。注意:应避免使用此属性,并仅作为最后手段使用。有关如何正确处理由于配置更改而重新启动的更多信息,请阅读处理运行时更改。

任何更改此活动默认行为的尝试似乎都是不好的做法。为了避免活动在重新启动期间重新加载耗时的数据结构,我们使用了onretainonconfigurationinstancegetLastNonConfigurationInstance-正式处理运行时更改

然而,当谈到处理片段中的旋转时,谷歌是否给了我们不同的建议?他们不想让我们关闭并重新启动Fragment?

公共对象OnRetainOnConfiguration实例()

此方法在API级别13中不建议使用。改为使用新的碎片API setRetainInstance(布尔值);这也可以通过Android兼容性包在旧平台上使用。

  1. 为什么Google鼓励我们在轮换期间关闭并重新启动活动,但鼓励我们在轮换期间保留碎片?
  2. 如果setRetainInstance(true)在处理轮换方面很好,为什么Google不把它作为片段的默认行为?

共有2个答案

别兴国
2023-03-14

因为你误解了它的用途setRetainInstance(true)只能在类似于solo元素/模块的片段中使用。处理套接字等的片段。一个没有GUI的人从保留中真正受益。带有GUI的片段可能不应该使用setRetainInstance(true)。此外,任何返回到backbackback的片段都不应使用setRetainIstance(true)

您可以将其泛化为只处理数据/连接等的任何片段。应该使用setRetainInstance(true)。但是有很多不同的方法来使用碎片,这不会受益于setRetainInstance(true)

盛辰沛
2023-03-14

>

  • 配置更改:当屏幕突然变得更宽、高度更低(典型的景观)时,视觉组件很容易更新其显示,并更智能地使用可用的屏幕。配置更改的另一个示例是用户滑动硬件键盘、设备语言更改等。为什么重新开始:

    >

    此外,在Android中,活动的生存受系统支配,因此,活动生命周期的设计(和推荐)很自然,它能够根据需要随时重新创建自己,就像它被破坏之前一样。此模式适应所有重新启动,这些重新启动也是由于配置更改引起的。如果您使您的活动和片段能够保持永久状态,那么配置更改就不会有那么大的问题。

    保留状态数据(模型),而不是显示它的内容(UI和视图)。

    setRetainInstance(true):建议仅与不包含任何引用的片段一起使用,这些片段将在旋转时重新创建。这意味着您不应该在包含上下文、视图等的任何片段上使用它。一个典型的视觉片段可以。但是它对于包含运行线程、异步任务、数据收集、加载资产、获取结果等对象的碎片非常有用。此方法有助于将非可视片段用作活动的非上下文相关对象的可拆卸支架。

  •  类似资料:
    • 问题内容: 让我们开始考虑两种类型的相机旋转: 摄像机绕点旋转(轨道): 相机旋转目标(FPS) 然后是一个更新函数,其中从眼睛/目标/上摄像机矢量中计算出投影/视图矩阵: 当摄像机的视图方向与上轴平行(在此处为z-up)时,出现这些旋转功能的问题…在那时,摄像机的行为确实令人讨厌,因此我将遇到以下故障: 所以我的问题是,我该如何调整以上代码,使相机完整旋转,而最终结果在某些边缘点上看起来并不奇怪

    • 我有两个图像,一个是竖屏,另一个是横向模式。当移动设备视图旋转时,切换这些图像的最佳方式是什么? 目前我只显示肖像图像。当设备旋转到横向模式时,纵向图像只需拉伸即可。 我是否应该在方向旋转处理程序中进行检查,并简单地将图像重置为正确的方向图像(即根据方向手动设置)?? 谢谢

    • 我在做点什么,好像卡住了。我试图在处理过程中通过按钮添加文本,但是,一旦我使用translate方法,我的文本就会出现颠倒。我如何简单地旋转它,使其看起来正常?以下是我所拥有的:

    • 我试图实现事件处理函数,以避免每次组件和时创建新函数。 场景1: 如果我像下面那样在构造函数中绑定函数,并且在中没有参数,那么它只会在bundle文件中创建一个新函数一次 场景2: 但是,当我想将以及传递给函数时,我相信每当组件和 所以 如何更好地编写场景2,使新函数在bundle文件中只创建一次,而不是每次组件渲染和重新渲染时都创建一次?可能吗? 编辑: param1和param2是我自己的自定

    • 问题内容: 首先,我必须说我对API java.util.concurrent很陌生,所以也许我正在做的事情是完全错误的。 我想怎么办? 我有一个Java应用程序,它基本上运行2个单独的处理(称为 myFirstProcess , mySecondProcess ),但是这些处理必须同时运行。 因此,我尝试这样做: myFirstProcess 和 mySecondProcess 是实现的类,它们

    • 使用cursors来获取android所保存的图像,需要对cursors进行外部存储授权。如果AndroidOS是6.0或更高版本,并且没有获得授权许可,申请将被终止。如果获得权限,则需要进行关闭游标的处理。 如果是Java,那么最好按照以下方式编写onStop,除了Kotlin,将会引发一个异常。 如果你能给我建议如何写得最好,我会很高兴的。 下面是使用的代码: