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()的超类实现,以便默认实现可以恢复视图层次结构的状态。
答案 0 :(得分:1)
AdapterView
(使用ViewGroup
的所有Adapter
的基类)已实现,以便不保存或恢复其子View
的状态,因为那是Adapter
的域名,应该在该级别处理。
对于静态包含在多个点的子布局的情况,如果它有任何要保存的状态,那么您需要为所有有状态View
分配唯一ID,或者手动管理状态来自Activity
或Fragment
。
不幸的是,ID需要在整个View
结构中是唯一的,而不是仅仅在它的兄弟之间。这是因为整个结构的状态保存在一个单维SpareArray
内。因此,如果结构中有多个有状态View
共享相同的id,则只保存结构中最后一个的状态,并将其应用于所有View
那个国家恢复的身份。