【发布时间】: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