【问题标题】:onRestoreInstanceState() and Unique View IdsonRestoreInstanceState() 和唯一视图 ID
【发布时间】:2014-12-15 03:27:23
【问题描述】:

android 开发者指南说你的活动中的Views 需要有唯一的 id 才能在onRestoreInstanceState() 中恢复它们。这是因为 onRestoreInstanceState() 的工作原理是使用 id 作为键的 SparseArray

我觉得这非常奇怪,因为许多标准的 Android 方法都鼓励重复使用 id。例如,ArrayAdapter 的所有构造函数都将 resourceId 作为参数,以便为ListView 中的所有子级扩展相同的 xml 资源。同样,如果您在 xml 中使用 <include layout ...>,则您正在重用视图 ID。

因此,除非开发人员实际上没有使用标准的推荐方法,否则我看不到有很多应用程序实际上满足所有 Views 具有唯一 ID 的要求。

这个结论是错误的吗?此外,如果 id 并非完全不同,onRestoreInstanceState 的行为是什么,这种行为是否可以接受?

编辑

相关报价出现在http://developer.android.com/training/basics/activity-lifecycle/recreating.html页面上,内容如下:

注意:为了让 Android 系统恢复 Activity 中视图的状态,每个视图必须有一个唯一的 ID,由 android:id 属性提供。

注意:始终调用 onRestoreInstanceState() 的超类实现,以便默认实现可以恢复视图层次结构的状态。

【问题讨论】:

  • 你在哪里看到的?它不在 onRestoreInstanceState 的文档中。这对我来说也没有任何意义,据我所知 onRestoreInstanceState 不会为您做任何事情 - 您必须手动恢复每个元素。
  • 我现在也找不到。它肯定曾经用大粗体字说(最近在八月我发布了一个类似的问题)!这一直困扰着我一段时间,但我最近没有检查过,所以也许他们已经改变了实现。这绝对是真的(参见例如stackoverflow.com/q/6045361/3973077 以及许多其他发现相同问题的人)。如果专家能确认发生了什么,我将不胜感激。
  • 这从未出现在 onRestoreInstanceState() 的文档中。 View 中该方法的基本实现旨在抛出带有该效果的消息的IllegalStateException,如果它使用任何其他具体参数而不是它保存和期望的参数调用:BaseSavedState.EMPTY_STATE。这通常是由于自定义 View 中的方法实现不正确造成的。
  • 我现在找到了我想要的引号 - 不是在 onRestoreInstanceState 的文档中,而是在 android 文档中。请参阅我更新的问题中的链接。

标签: android view onrestoreinstancestate


【解决方案1】:

AdapterView(使用Adapter的所有ViewGroups的基类)的实现是为了不保存或恢复其子Views的状态,因为这是@的域987654325@,应该在那个级别处理。

对于静态包含在多个点的子布局的情况,如果它有任何状态要保存,那么您将需要为所有有状态的Views 分配唯一的 id,或者从ActivityFragment

不幸的是,id 在整个 View 结构中必须是唯一的,而不仅仅是在它的兄弟姐妹中。这是因为整个结构的状态保存在一个一维SpareArray 中。因此,如果结构中有多个有状态的Views 共享相同的id,则只保存结构中最后一个的状态,并将应用于所有具有该id 的Views恢复。

【讨论】:

  • 谢谢。这是一个非常有说服力的答案。我被 android 糟糕的文档误导了(不是第一次!)。我链接到的页面确实应该提到唯一 ID 要求不适用于 AdapterView 的孩子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-17
  • 2011-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-05
相关资源
最近更新 更多