Вопрос
Как сохранить состояние экземпляра виджета, когда с помощью заданных в XML макетов виджетов все компоненты отдельных экземпляров виджета имеют одинаковый идентификатор?
Пример
Взять, к примеру, виджет NumberPicker
, который используется в виджете TimePicker
(обратите внимание, что NumberPicker
не предоставляется SDK). Это простой виджет с тремя компонентами, которые надуваются из number_picker.xml
: одна кнопка увеличения, одна кнопка уменьшения и одна EditText
, где вы можете непосредственно ввести число. Чтобы код взаимодействовал с этими виджетами, все они имеют идентификаторы (R.id.increment
, R.id.decrement
и R.id.timepicker_input
соответственно).
Допустим, у вас есть три NumberPicker
в макете XML, и вы даете им различные идентификаторы (например, R.id.hour
, R.id.minute
). Then Этот макет затем надувается на представление содержимого действия. Мы решили изменить ориентацию действия, поэтому Activity.onSaveInstanceState(Bundle)
услужливо сохраняет наше состояние просмотра для каждого представления, у которого есть идентификатор (это поведение по умолчанию).
К сожалению, три NumberPicker
имеют EditText
с одинаковым идентификатором - R.id.timepicker_input
. Таким образом, когда деятельность восстанавливается, самым дальним в иерархии представления является тот, состояние которого, похоже, сохраняется для всех трех из них. Кроме того, фокус возвращается к первому NumberPicker
при восстановлении независимо от того, какой фокус был при сохранении.
TimePicker
обходит эту проблему, сохраняя само состояние отдельно. К сожалению, это не сохранит положение курсора или сфокусированный вид без дополнительной работы. Я не уверен, как оно сохраняет это состояние, если оно вообще происходит (а быстрая игра с диалоговым окном ввода времени, похоже, указывает на то, что он может каким-то образом).
Пожалуйста, посмотрите пример кода, чтобы продемонстрировать эту проблему:
https://github.com/xxv/AndroidNumberPickerBug
¹ В иерархии представлений устанавливается идентификатор LinearLayout
, который NumberPicker
распространяется на ваши идентификаторы.