重写 onSaveInstanceState

2024-01-04

我正在努力应对onSaveInstanceState类中的方法View https://developer.android.com/reference/android/view/View.html#onSaveInstanceState%28%29 (not 班上的那个Activity https://developer.android.com/reference/android/app/Activity.html#onSaveInstanceState%28android.os.Bundle%29)。该方法确实返回一个Parcelable https://developer.android.com/reference/android/os/Parcelable.html。我自己导出的View https://developer.android.com/reference/android/view/View.html from ViewGroup https://developer.android.com/reference/android/view/ViewGroup.html并覆盖该方法来保存我自己的状态。但是当要保存状态时,我遇到了一个例外:

java.lang.IllegalStateException:
Derived class did not call super.onSaveInstanceState()

确实如此,但简单地调用该方法对我来说似乎还不够。那么我应该怎么做呢?如果该方法将通过Parcel https://developer.android.com/reference/android/os/Parcel.html要写入,我可以简单地将同一个包裹传递给超类,这样事情就会按顺序写入。但这是一个返回值。

我是否应该将此返回的对象包含为我自己的成员Parcelable表示和使用Parcel.writeParcelable https://developer.android.com/reference/android/os/Parcel.html#writeParcelable%28android.os.Parcelable,%20int%29如果需要的话将其与我自己的数据一起整理?或者是否有更好的方法来处理父调用和可分割对象的链接?如果是这样,在加载超类的实例状态时应该使用什么类加载器?


由于 zapl 没有将他的评论转化为答案,所以我这样做了。

有没有更好的方法来处理父调用和可分割对象的链接?

实现此目的的规范方法是使用自己的类来保存派生的数据View.BaseSavedState http://developer.android.com/reference/android/view/View.BaseSavedState.html,这又源自AbsSavedState http://developer.android.com/reference/android/view/AbsSavedState.html。您可以致电onSaveInstance父类的处理程序并将结果对象传递给您自己的类的构造函数。恢复数据时,getSuperState给出针对父类的实例。

典型的代码示例如下所示:

static class SavedState extends View.BaseSavedState {
  // include own data members here
  public SavedState(Parcelable superState) {
    super(superState);
  }
  private SavedState(Parcel in) {
    super(in);
    // read own data here
  }
  @Override public void writeToParcel(Parcel out, int flags) {
    super.writeToParcel(out, flags);
    // write own data here
  }
  public static final Parcelable.Creator<SavedState> CREATOR =
      new Parcelable.Creator<SavedState>() {
    public SavedState createFromParcel(Parcel in) { return SavedState(in); }
    public SavedState[] newArray(int size) { return new SavedState[size]; }
  };
}

@Override public Parcelable onSaveInstanceState() {
  SavedState state = new SavedState(super.onSaveInstanceState());
  // set data members here
  return state;
}

@Override public void onRestoreInstanceState(Parcelable parcelable) {
  SavedState state = (SavedState)parcelable;
  super.onRestoreInstanceState(state.getSuperState());
  // restore from data members here
}

以上内容改编自这个演示文稿 https://speakerdeck.com/cyrilmottier/crafting-custom-android-views?slide=38由 Cyril Mottier 编写,但也应该与设计者一般如何使用此类的意图非常匹配。

我是否应该将此返回的对象包含为我自己的成员Parcelable表示和使用Parcel.writeParcelable https://developer.android.com/reference/android/os/Parcel.html#writeParcelable%28android.os.Parcelable,%20int%29如果需要的话将其与我自己的数据一起整理?

虽然上面提到的似乎是优选的,幕后 https://android.googlesource.com/platform/frameworks/base/+/5fceada31f0dc8f8e003e9c1d0a0ed0363711343/core/java/android/view/AbsSavedState.java它确实依赖于writeParcelable以及。因此,如果有理由不使用该基类,只需调用writeParcelable存储超类的状态应该没问题。

加载超类的实例状态时应该使用什么类加载器?

The 目前的实施AbsSavedState https://android.googlesource.com/platform/frameworks/base/+/5fceada31f0dc8f8e003e9c1d0a0ed0363711343/core/java/android/view/AbsSavedState.java确实使用null作为类加载器参数,导致使用默认类加载器。但是,该行代码标有FIXME评论,所以有一天它可能会改变。

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

重写 onSaveInstanceState 的相关文章

  • 找不到参数的方法 dependencyResolutionManagement()

    我正在尝试使用老师给我的一个项目 但它显示了一个错误 Settings file Users admin AndroidStudioProjects HTTPNetworking settings gradle line 1 A probl
  • 如何对这个字符串进行子串化

    我想得到这个字符串的 4 个部分 String string 10 trillion 896 billion 45 million 56873 我需要的4个部分是 10万亿 8960亿 4500万 和 56873 我所做的是删除所有空格 然
  • Android Studio 3.0 Canary 9 - 无法解析包

    我在 Android Studio 3 0 Canary 9 中遇到几个错误 这些错误是 无法解析 android 软件包 下面列出了一些错误 我刚刚安装了 SDK 的所有额外软件包 但仍然收到 gradle 构建错误 Error 82 1
  • 类型容器“Android 依赖项”引用不存在的库 android-support-v7-appcompat/bin/android-support-v7-appcompat.jar

    我在尝试在我的项目中使用 Action Bar Compat 支持库时遇到了某种错误 我不知道出了什么问题 因为我已按照此链接中的说明进行操作 gt http developer android com tools support libr
  • android中向sqlite中插入大量数据

    目前 我必须一次向我的 Android 中插入超过 100 亿条数据 然而 内存不足的问题会使程序崩溃 sqlite 插入测试非常简单 只需使用 for 循环生成 sql 插入命令并通过 开始 和 提交 进行包装 private Array
  • SearchView过滤ListView

    我已经实现了搜索视图来过滤我的列表视图项目 当我输入任何文本时 它会过滤列表 但当我退出搜索视图时 它不会返回原始列表项 public class PlacesListAdapter extends ArrayAdapter
  • java.lang.NoClassDefFoundError:org.apache.batik.dom.svg.SVGDOMImplementation

    我在链接到我的 Android LibGDX 项目的 Apache Batik 库时遇到了奇怪的问题 但让我们从头开始 在 IntelliJ Idea 中我有一个项目 其中包含三个模块 Main Android 和 Desktop 我强调的
  • 带有 EditText 和 Spinner 的对话框

    我有一个按钮 单击后会弹出一个对话框 我希望对话框有一个EditText and a Spinner对话框内 我不知道如何设置它的视图 我有一个代码AlertDialog它有效 只是EditText and Spinner我需要将其放入其中
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • 获取当前 android.intent.category.LAUNCHER 活动的实例

    我创建了一个库项目 并在多个应用程序之间共享 我实现了一个简单的会话过期功能 该功能将在一段时间后将用户踢回到登录屏幕 登录屏幕活动是我的主要活动 因此在清单中它看起来像这样
  • Ubuntu 16.04 - Genymotion:找不到 /dev/hw_random

    I install Genymotion on the Ubuntu 16 04 64Bit I created a virtual emulator for Android 6 0 then I run this emulator but
  • Android Studio 0.4.3 Eclipse项目没有gradle

    在此版本之前 在 Android Studio 中按原样打开 Eclipse 项目似乎很容易 无需任何转换 我更喜欢 Android Studio 环境 但我正在开发一个使用 eclipse 作为主要 IDE 的项目 我不想只为这个项目下载
  • 字符串数组文本格式化

    我有这个字符串 String text Address 1 Street nr 45 Address 2 Street nr 67 Address 3 Street nr 56 n Phone number 000000000 稍后将被使用
  • Android向menuItem添加子菜单,addSubMenu()在哪里?

    我想根据我的参数以编程方式将 OptionsMenu 内的子菜单添加到 menuItem 中 我检查了android sdk中的 MenuItem 没有addSubMenu 方法 尽管你可以找到 hasSubMenu 和 getSubMen
  • 增加活动的屏幕亮度

    显然 Android 操作系统中至少有三种不同的技术可以改变屏幕亮度 其中两个在纸杯蛋糕之后不再起作用 而第三个被接受的技术显然有一个错误 我想在单视图活动开始时增加屏幕亮度 然后在活动结束时将亮度恢复为用户设置 没有按钮 没有第二个视图或
  • 在activity_main.xml中注释

    我是安卓新手 据我所知 XML 中的注释与 HTML 中的注释相同 使用 形式 我想在 Android 项目的 Activity main xml 配置文件中写一些注释 但它给了我错误 值得注意的是 我使用的是 Eclipse 但目前 我直
  • Android:膨胀布局时出现 StackOverFlowError 和 InvokingTargetException

    首先 对不起我的英语 我在膨胀布局时有一个问题 我有一个自定义视图 从 LinearLayout 扩展而来 称为按钮帮助 我在名为的布局上使用该视图加载活动 我的以下代码在所有设备和模拟器上都能完美运行 但具有 QVGA 屏幕 例如 Sam
  • 一次显示两条Toast消息?

    我希望在一个位置显示一条 Toast 消息 并在另一位置同时显示另一条 Toast 消息 多个 Toast 消息似乎总是按顺序排队和显示 是否可以同时显示两条消息 是否有一种解决方法至少可以提供这种外观并且不涉及扰乱活动布局 Edit 看来
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 如何将 google+ 登录集成到我的 Android 应用程序中?

    大家好 实际上我需要通过我的应用程序从 google 登录人们 现在我阅读了 google 上的文档 其中指出 要允许用户登录 请将 Google Sign In 集成到您的应用中 初始化 GoogleApiClient 对象时 请求 PL

随机推荐

  • Find_by_sql 作为 Rails 范围

    Sitepoint 的 r937 非常友善地帮助我找出从数据库返回正确结果所需的查询 我需要的是能够使用这个查询作为范围 并且能够将其他范围链接到这个范围上 查询是 SELECT coasters FROM SELECT order rid
  • JavaScript:“函数体后缺少 } 语法错误”

    好吧 你知道这个错误了 但是我到底为什么会收到这个错误呢 当它在本地运行时 我根本没有收到任何错误 但是当我上传我的项目时 我遇到了这个恼人的语法错误 我已经检查过Firebug https en wikipedia org wiki Fi
  • dplyr 和 tidyr - 使用因子一次性计算大量线性模型

    在阅读了 tidyverse 的更多内容后 我开始立即拟合许多线性模型 如中所述this https blog rstudio org 2016 02 02 tidyr 0 4 0 也就是说 我会按照以下方式做一些事情 library dp
  • 声明具有未知大小目标 c 的对象 X 的数组

    我将如何在 h 文件中声明一个未知大小的数组 我将在类内的 a 函数中计算该数组 例如 我可能有 20 或 30 个 NSArray 只是一个例子 不是我需要的 但是当第一次调用该类时我不会知道确切的数量 在实施文件中 id init if
  • iOS8 模拟器上缺少键盘?

    我正在模拟器中针对 iOS8 检查我的应用程序 令我困惑的一件事是 当我点击 UITextField 或 UITextView 时 键盘不会出现在屏幕上 我仍然可以使用硬件键盘输入文本 此外 如果输入元素具有 inputAccessoryV
  • 在 Makefile 中转义文件名中的冒号

    有没有办法让 GNU make 正确处理包含冒号的文件名 我遇到的具体问题恰好涉及模式规则 这是一个不依赖于剪切和粘贴制表符的简化版本 make version GNU Make 3 81 Copyright C 2006 Free Sof
  • Powershell:从 C# Web 应用程序运行脚本时,Set-ItemProperty 不起作用

    我有一个托管在 IIS 7 5 上的 C Web 应用程序 它运行 powershell 脚本来创建应用程序池和网站 如果我从命令提示符运行 powershell 脚本 它可以工作 但是当我通过 C 应用程序 Set ItemPropert
  • 以编程方式与 OS X 或 Linux 中的串行端口通信

    我有一个 Prolite LED 标牌 我喜欢将其设置为显示来自 apache 日志的滚动搜索查询和其他有趣的统计数据 问题是 我的 G5 没有串口 所以我必须使用 USB 转串口适配器 它显示为 dev cu usbserial 和 de
  • CoreData 问题:-[NSManagedObject setValue:]:无法识别的选择器发送到实例

    我昨天刚开始使用 CoreData 我快要疯了 我创建了一个使用 CoreData 的项目 勾选了框 使用 CoreData 创建了实体 然后为所有实体创建了 NSManagedObject 类 我想他们创建了实体的 setter 和 ge
  • Scala 与 Java 9 不兼容 - java.lang.NoClassDefFoundError

    在我的电脑上安装 Java 9 后运行一个示例 Scala SBT 项目 我就遇到了这个异常 我已经尝试了一些找到的解决方案 但一无所获 Java 9 和 Scala 之间是否存在不兼容的情况 斯卡拉版本 2 12 3 Java版本 jav
  • 如何返回导航堆栈?

    我的应用程序有 7 个后续视图控制器 VC1 VC7在我的导航栏中 我有一个带有操作的后退按钮 点击和长按 当在任何 VC 中长按后退按钮时 应用程序应转到 VC2 并呈现它 就好像用户从 VC1 转到 VC2 一样 具体来说 点击右后退按
  • 构建 ID 的测试结果

    作为计划构建的一部分 我运行并发布了多个具有不同测试运行标题的测试 我的场景是 在发布管道期间 我想获取为正在创建的版本的构建发布的每个测试运行标题的测试摘要 可以使用哪些 Azure DevOps API 或 API 组合来实现此目的 谢
  • 将光标传递到另一个活动是否安全?

    我正在尝试使用光标进行水平滑动 但我只是没有摸索某些东西 希望这里有人可以帮助我理解 我有一个显示项目列表的活动 它使用一个ListView由习俗支持CursorAdapter 并且该适配器由LoaderCallback 这都是标准的东西
  • 在Raspberry Pi上使用Selenium和Python登录zoom时出现错误401

    我正在学习使用 Selenium 我的目标是通过 Raspberry Pi 4 上的 python 程序打开 Zoom 运行粘贴的代码后 该程序按预期工作 打开放大浏览器 最大化窗口 选择并单击 登录 输入凭据 然后按 Enter 键 尝试
  • PARSE_DATETIME 格式化为一年中的某一天

    BigQuery 中与年份 j 格式设置元素一起使用的 PARSE DATETIME 函数存在问题 该函数似乎忽略了一年中的某一天元素 Eg select PARSE DATETIME Y j 2013243 returns 2013 01
  • PayPal API,寻找合适的 API

    我需要在我的网站中添加使用 PayPal 付款的选项 我想要一个 API 我可以在其中向 PayPal 发送信息并立即取回交易 ID 以便我可以将其保存在我的数据库中 哪种 API 最适合我 有没有办法做到这一点 我看到他们有这个清单 li
  • 使用 virtualenv 时在 pythonpath 中包含 Git 子模块

    我正在使用 Git 对 Django 项目进行版本控制 尽可能将所有不属于项目本身但项目所依赖的源代码作为 Git 子模块引入 这些生活在lib目录并且必须包含在 python 路径中 目录 文件布局如下所示 git docs lib my
  • Swift:如何使 UIView 在 UITableViewCell 中可点击?

    里面一个UITableViewCell 我正在尝试实现一个button与两个image and a text 看来是标准UIButton无法实现这一点 所以我创建了一个UIView其中包含一个UIImageView and a UILabe
  • 嵌入式 C++ 系统中的持续集成/单元测试

    通常使用哪些工具进行单元测试 尤其是嵌入式系统的持续集成 我特别认为你通常必须交叉编译和部署 而且你不能轻松地可视化目标平台 运行测试代码和框架也可能很困难 我可以用什么来缓解这些困难呢 我认为它应该是某种双重目标 构建服务器在更容易的目标
  • 重写 onSaveInstanceState

    我正在努力应对onSaveInstanceState类中的方法View https developer android com reference android view View html onSaveInstanceState 28