为什么我想要 `setRetainInstance(false)`? - 或 - 处理设备旋转的正确方法

2024-03-08

如果我对此有任何错误,请纠正我。这是一种澄清问题,因为我还没有在任何地方看到它明确写过。

在Android 4中,您可以调用setRetainInstance(true) on a Fragment这样在配置更改时(这基本上意味着设备旋转),Fragmentjava 对象不会被销毁,也不会创建它的新实例。即,实例被保留。

这比 Android 1-3 更理智,也更不令人恼火,因为你不必处理onRetainNonConfigurationState罢工>Instance()并将所有数据捆绑在一起,以便可以将其传递给新的Fragment (or Activity) 实例只需再次解绑。这基本上就是您期望发生的情况,并且可以说它应该如何工作Activity从头开始。

With setRetainInstance(true)视图也被重新创建(onCreateView()被调用)如您所期望的轮换。我假设(未测试)资源解析(layout vs layout-land) works.

所以我的问题有两个:

  1. 为什么不是这样的Activities从一开始就。
  2. 为什么这不是默认值?有没有什么理由让你would其实想要你的Fragment被无意义地摧毁并轮流重建?因为我想不出任何办法。

Edit

为了澄清我将如何做到这一点:

class MyFragment extends Fragment
{
    // All the data.
    String mDataToDisplay;
    // etc.

    // All the views.
    TextView mViewToDisplayItIn;
    // etc.

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
        mDataToDisplay = readFromSomeFileOrWhatever(); // Ignoring threading issues for now.
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        return inflater.inflate(R.layout.my_fragment, container, false);
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState)
    {
        // At this point if mViewToDisplayItIn was not null, the old one will be GC'd.
        mViewToDisplayItIn = view.findViewById(R.id.the_text_view);
        mViewToDisplayItIn.setText(mDataToDisplay);
    }

    // Optionally:
    @Override
    public void onDestroyView()
    {
        // All the view (and activity) to be GC'd.
        mViewToDisplayItIn = null;
    }
}

这样配置更改(这基本上意味着设备旋转)

以及更改区域设置、更改 SIM、更改默认字体大小、插入或移除外部键盘、将设备放入扩展坞中或将其从扩展坞中移除等。

您不必处理 onRetainNonConfigurationState()

That's onRetainNonConfigurationInstance().

捆绑所有数据,以便将其传递到新的 Fragment(或 Activity)实例,然后再次解绑

您的数据应该已经“捆绑”(例如,私有静态内部类的实例),因此不需要“捆绑”或“解绑”。此外,它通常不应该是“您的所有数据”,除非您喜欢内存泄漏。

我假设(未测试)资源分辨率(布局与布局区域)有效。

Correct.

您是否有任何理由希望您的片段被无意义地销毁并轮流重新创建?

Sure.

正如您所注意到的,所有小部件都被重新创建,因此与小部件绑定的数据成员不仅不需要保留。除非你专门将它们重置为null以某种方式在保留的片段上,直到onCreateView()再次调用时,这些数据成员将保留旧的小部件,而旧的小部件将保留旧的活动实例,这将阻止旧的活动实例被垃圾收集。 AFAIK,onCreateView()在重新显示片段之前不会被调用,这可能不会持续很长一段时间(该片段没有在新方向中使用,或者该片段用于某个页面)ViewPager用户在旧方向访问过但没有在新方向再次访问,等等)。这意味着保留的片段可能会在相当长的一段时间内保留旧的活动对象。取决于什么else该活动可能已经持续(例如,大型Bitmap对象),这可能很糟糕。

类似地,本身保存大量数据的片段(在配置更改后可能会或可能不会使用该片段)是不应该保留的片段。

此外,还会有一些片段根本不需要保留任何内容(例如,所有数据都由Loaders,它们已经意识到配置更改并适当地处理它们)。

等等。

就垃圾收集问题而言,默认不保留片段是最安全的做法。您可以选择保留一些片段,但随后就有责任了you确保你这样做不会把自己搞砸。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我想要 `setRetainInstance(false)`? - 或 - 处理设备旋转的正确方法 的相关文章

  • Android 2.1:如何轮询现有蓝牙连接的 RSSI 值?

    我需要知道使用 Android 2 1 手机与远程设备建立蓝牙连接的信号强度 从SDK中 我可以看到我可以在发现远程设备时确定RSSI 但我不知道如何随着时间的推移更新该 RSSI 值 有人可以帮我吗 谢谢 从 SDK 中这是获取 RSSI
  • Android 索引滚动

    http developer android com design building blocks scrolling html http developer android com design building blocks scrol
  • 旋转 ImageView 及其背景而不裁剪

    我已经进行了很多搜索 但找不到解决我的问题的方法 我不能使用android rotation因为我希望这个应用程序与 Android API 11 版本兼容 我的问题与此类似 在 Android 中旋转视图 https stackoverf
  • 如何从菜单项获取视图引用?

    我试图获取菜单项的参考 但我就是不能 整个事情都在一个片段内 Menu boat accept menu xml menu menu
  • 获取 UIView 的当前角度/旋转/弧度?

    如何获取 UIView 当前的角度 旋转 弧度 你可以这样做 CGFloat radians atan2f yourView transform b yourView transform a CGFloat degrees radians
  • Android中每10秒显示一次数据

    我必须每 10 秒后显示一些数据 谁能告诉我该怎么做 您还可以使用另一种方法按特定时间间隔更新 UI 以上两个选项都是正确的 但根据具体情况 您可以使用替代方法在特定时间间隔更新 UI 首先为 Handler 声明一个全局变量 用于从 Th
  • Android/iOS 上的相机远程快门如何工作?

    我最近在 Android iOS 上遇到了一个使用蓝牙的内置相机应用程序的远程快门 这是我找到的产品的示例链接 Link http www youtube com watch v cyVG76HDvh4 不是来打广告的 只是简单了解背后的技
  • ViewPager 具有不同的纵向和横向适配器

    在纵向模式下 我的ViewPager有 3 个片段 A B C 但在横向模式下 它只有 2 个片段 A 和 C 所以我创建了 2 个FragmentStatePagerAdapters 代表每种模式 问题是当屏幕方向改变时 ViewPage
  • 以编程方式创建进度绘制

    我有一个场景 我需要有大量的进度条可绘制对象 我无法为所有这些创建 xml 资源 因为我希望用户选择一种颜色 然后用于动态创建可绘制对象 下面是 xml 中的一个这样的可绘制对象 我如何以编程方式创建这个精确的可绘制对象
  • 如何将值从 recyclerview 项目传递到另一个活动

    当我们单击 recyclerview 项目时 我试图将 recyclerview 项目中的值传递给另一个活动 这里我使用的是OnItemTouchListener 我从 JSON 检索数据并将其解析为 ArrayList 我保存了5个参数
  • Android 日期/时间显示 0 而不是 12

    我想知道下面的代码有什么问题 Assign hour set in the picker c set Calendar HOUR selectedHour c set Calendar MINUTE selectedMinute For a
  • 如何提高加速度计和指南针传感器的精度?

    我正在创建一个增强现实应用程序 当手机面向兴趣点 GPS 位置存储在手机上 时 它可以简单地可视化文本视图 文本视图绘制在屏幕中的兴趣点位置上 它工作正常 问题是指南针和加速度计非常 变体 并且文本视图由于传感器的准确性而不断左右上下移动
  • 序列化/反序列化 LinkedHashMap (android) java

    所以我想将 LinkedHashMap 传递给意图 SEND THE MAP Intent singlechannel new Intent getBaseContext singlechannel class singlechannel
  • Intent.ACTION_DIAL 号码以 # 结尾

    所以我尝试通过以下方式发送号码Intent ACTION DIAL以 结尾 例如 123 但是当Android Dialer应用程序启动时 只有 123 不见了 我正在使用以下代码来触发 Android 的拨号应用程序 Uri number
  • BLE:使用 Android / iOS 读取长特征值

    对于正常的特征读取 仅读取 MTU 大小 20 字节 的数据 我的客户将提供更大尺寸 超过 100 字节 的特征 我看到 BLE 提供了 长读取 功能 可以读取直到达到特征的大小 https bluegiga zendesk com ent
  • adb shell 的 BroadcastReceiver 权限

    考虑一个简单的工具 使用BroadcastReceiver实现一个简单的目标 因为这不应该被其他应用程序使用 所以它定义了一个保护级别为signature or signatureOrSystem
  • 将文件夹中结构化的预构建文件集添加到 android out 文件夹

    我为arm编译了glibc 这与Android glibc或bionic C不同 因为我编译的glibc环境将有助于提供更多api 现在我可以在 Android 运行时将 glibc 环境复制到 system 文件夹中 并且在执行 chro
  • SecurityException: getSerial: 用户 10134 不满足访问设备标识符的要求

    我想从 Android 手机获取 Build getSerial 在 Android O 之前 我需要 Manifest permission READ PHONE STATE 权限 但是在 Android 10 中我遇到了上述异常 我所做
  • 如何防止LRU缓存android中的内存不足错误

    我在我的 Android 应用程序中使用内存 LRU 缓存来缓存位图 但是在将某些位图加载到 LRU 映射中后 应用程序强制关闭并提示内存不足异常 我花了一整天的时间 但还没有找到解决方案 请任何人都可以帮助我 我严重陷入这个问题 提前致谢
  • 根据内容对列表视图中的相似行进行分组

    i have a listview that displays a set of rows each row is clickable now i wish to group similar type of rows under one h

随机推荐

  • 检查 JavaScript 中的全局属性/函数是否已被覆盖

    JavaScript 可以轻松覆盖全局对象的属性和函数 我想找到一种方法来检查全局属性的原始版本是否已被替换 考虑有人将其放入 HTML 中 如果 myscript js 在某处调用encodeURIComponent 函数 它现在的行为将
  • 将 XX:XX AM/PM 转换为 24 小时制

    我搜索过谷歌 但找不到如何获取字符串 xx xx 上午 下午 例如下午 3 30 并将其更改为现在的 24 小时 例如 前一个时间是 15 30 我研究过简单地使用 if then 语句来操作字符串 但它看起来非常乏味 有什么简单的方法可以
  • 覆盖 Spring 表单错误消息

    在 Spring 中如何覆盖默认表单错误消息 我正在使用一个Validator和一个属性文件来添加我自己的错误消息 但是 例如 如何覆盖因转换 编码错误而打印的消息 它们似乎是自动生成的 我认为对用户没有帮助 Failed to conve
  • 如何优化查找相关性的极其缓慢的 MySQL 查询

    我有一个非常慢 通常接近 60 秒 的 MySQL 查询 它试图找到用户对一项民意调查的投票方式与他们对所有先前民意调查的投票方式之间的相关性 基本上 我们收集在给定民意调查中投票给某一特定选项的每个人的用户 ID 然后 我们查看该小组如何
  • 打开 dired 并选择与前一个缓冲区关联的文件?

    假设我正在编辑blah txt使用 Emacs 我决定打开dired以重命名文件 https stackoverflow com questions 384284 can i rename an open file in emacs 384
  • 如何使用 RxJS 对数据变化做出“反应”?

    RxJS 初学者 我在使用 RxJS 保存和跟踪数据更改时遇到问题 假设我在小视图 小部件中构建我的应用程序 每个视图 小部件都有自己的状态 并且应该对数据更改执行操作 我怎么做 更具体的例子 假设我有一个名为Widget and Widg
  • Autofac 和 Quartz.Net 集成

    有没有人有整合经验autofac and 石英网 如果是这样 最好在哪里控制生命周期管理 IJobFactory IJob 的执行中还是通过事件侦听器 现在 我正在使用自定义 autofacIJobFactory来创建IJob实例 但我没有
  • 在新门户中为辅助角色配置远程桌面

    我在新的 Windows Azure 门户中配置远程桌面连接时遇到问题 创建了一个新的工人角色 配置了远程桌面连接的过期时间 导出并上传生成的证书 发布了工作者角色 在新的 Windows Azure 门户 manage windowsaz
  • ASP.NET C# - 在服务器上保存文件流

    我有初学者的问题 如何将文件流保存到服务器上的文件 我懂了 var source Request QueryString src WebClient webclient new WebClient using Stream stream w
  • 即使使用 where 子句,“SELECT COUNT(*)”也很慢

    我试图弄清楚如何优化 MySQL 中非常慢的查询 我没有设计这个 SELECT COUNT FROM change event me WHERE change event id gt 1212281603783391 COUNT 32240
  • 如何通过蓝牙麦克风录制音频

    我正在尝试通过蓝牙耳机麦克风录制音频 但我只能听到音频 但无法通过蓝牙麦克风录制音频 而是可以从移动麦克风录制语音 我正在使用下面的代码 IntentFilter newintent new IntentFilter newintent a
  • 如何使用 Delphi 在 Openoffice 文档的页眉/页脚/表格中搜索文本标签并替换为图像

    我有打开的 Office 模板文档 我需要在其中搜索 CHART 100 等标签 并将其替换为驻留在 PC 上某个文件夹中的图像文件 我正在使用上一个问题中提到的方法 如何使用 Delphi 在 OpenOffice 文档中插入图像 htt
  • 使用Python请求模块尝试/除外的正确方法?

    try r requests get url params s thing except requests ConnectionError e print e 它是否正确 有没有更好的方法来构建这个 这会涵盖我所有的基础吗 看看请求异常文档
  • Flutter中刷新ListView

    我怎样才能刷新ListView 假设在页面 A 中 我有一个ListView 并且该行项目中有一个菜单图标 当我单击菜单图标时 它将显示一个底部工作表对话框 其中有一个删除图标 单击删除图标时 会弹出删除确认对话框 单击确认对话框中的 是
  • Gradle 无法构建 ActionBarSherlock

    我正在使用基于 IDEA 的新 Android studio 并尝试在主模块的依赖项中使用 ABS 库构建项目 我收到错误 Gradle package com actionbarsherlock app does not exist Gr
  • 标头防护难题 - 已在 .obj 问题中定义

    我有一个类 A 它必须包含两个文件 类 X 和类 Y 不幸的是 类 Y 还需要在其头文件中包含类 X 因为构造函数将指向类 X 类型的指针作为参数 潜在的问题是会出现链接器错误吗 因为类 A 现在有两份类 X 的副本 一份是它需要使用的 一
  • ORU-10027:缓冲区溢出,限制为 100000 字节

    我在 PL SQL 中生成 100k 记录时遇到以下错误 我创建了一个包并从匿名块调用该包 Error report ORA 20000 ORU 10027 buffer overflow limit of 100000 bytes ORA
  • 如何在 Swift 中获取 PDF 中的所有文本?

    我有一个 PDF 文档 想提取其所有文本 我尝试了以下方法 import Quartz let url NSBundle mainBundle URLForResource test withExtension pdf let pdf PD
  • 当表单数据的各个部分位于不同的页面上时,如何存储它们?

    每当我要为客户准备一份长表格时 我总是想将其分成单独的页面 这样访问者就不必填写全部内容 而是分步骤填写 就像是 Step 1 gt Step 2 gt Step 3 gt Thank You 我从未这样做过 原因只有一个 我不知道如何有效
  • 为什么我想要 `setRetainInstance(false)`? - 或 - 处理设备旋转的正确方法

    如果我对此有任何错误 请纠正我 这是一种澄清问题 因为我还没有在任何地方看到它明确写过 在Android 4中 您可以调用setRetainInstance true on a Fragment这样在配置更改时 这基本上意味着设备旋转 Fr