问题
当通过使用 XML 定义的小部件布局,各个小部件实例的组件都具有相同的 ID 时,如何保存视图小部件实例状态?
例子
NumberPicker
以小部件中使用的小部件为例TimePicker
(请注意,NumberPicker
它不向 SDK 公开)。这是一个简单的小部件,由三个组件组成number_picker.xml
:一个增量按钮、一个减量按钮和一个EditText
可以直接输入数字的按钮。为了让代码与这些小部件交互,它们都具有 ID(R.id.increment
分别为R.id.decrement
和R.id.timepicker_input
)。
假设您NumberPicker
在一个 XML 布局中有 3 个 s,并为它们指定了不同的 ID(例如R.id.hour
、R.id.minute
)。¹然后,此布局被扩展为活动的内容视图。我们决定更改活动的方向,因此Activity.onSaveInstanceState(Bundle)
有助于为每个具有 ID 的视图保存视图状态(这是默认行为)。
不幸的是,这三个NumberPicker
s 都有EditText
共享相同 ID 的 s — R.id.timepicker_input
。因此,当活动恢复时,视图层次结构中最底层的那个是其状态似乎为所有三个都保留的那个。NumberPicker
此外,无论保存时哪个具有焦点,恢复时焦点都会转到第一个。
TimePicker
通过单独保存状态本身来解决这个问题。不幸的是,如果没有更多的工作,这不会保留光标位置或焦点视图。我不确定它如何保持这种状态(如果它确实如此)(并且快速播放时间输入对话框似乎表明它可以以某种方式)。
请查看示例代码来演示此问题: https ://github.com/xxv/AndroidNumberPickerBug
¹ 在视图层次结构中,这会设置扩展为您的 ID 的 ID LinearLayout
。NumberPicker