1

android 开发者指南说,Views在你的活动中需要有唯一的 id 才能在onRestoreInstanceState(). 这是因为onRestoreInstanceState()通过SparseArray使用 ids 作为键来工作。

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

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

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

编辑

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

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

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

4

1 回答 1

3

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

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

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

于 2014-12-15T09:22:42.340 回答