onRestoreInstanceState()和Unique View ID

时间:2014-12-15 03:27:23

标签: android view onrestoreinstancestate

Android开发者指南说,您的活动中的Views需要具有唯一ID才能在onRestoreInstanceState()中恢复它们。这是因为onRestoreInstanceState()的工作原理是将SparseArray作为键设置ID。

我发现这非常奇怪,因为许多标准的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系统恢复活动中的视图状态,每个视图必须具有唯一的ID,由android:id属性提供。

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

1 个答案:

答案 0 :(得分:1)

AdapterView(使用ViewGroup的所有Adapter的基类)已实现,以便不保存或恢复其子View的状态,因为那是Adapter的域名,应该在该级别处理。

对于静态包含在多个点的子布局的情况,如果它有任何要保存的状态,那么您需要为所有有状态View分配唯一ID,或者手动管理状态来自ActivityFragment

不幸的是,ID需要在整个View结构中是唯一的,而不是仅仅在它的兄弟之间。这是因为整个结构的状态保存在一个单维SpareArray内。因此,如果结构中有多个有状态View共享相同的id,则只保存结构中最后一个的状态,并将其应用于所有View那个国家恢复的身份。