Руководство разработчика для разработчиков Android говорит, что в вашей деятельности необходимо иметь уникальные идентификаторы, чтобы восстановить их в onRestoreInstanceState()
. Это потому, что onRestoreInstanceState()
работает, делая SparseArray
с идентификаторами в качестве ключей.onRestoreInstanceState() и уникальные идентификаторы просмотров
Я нахожу это чрезвычайно странным, потому что многие стандартные подходы к Android поощряют повторное использование идентификаторов. Например, все конструкторы для ArrayAdapter
принимают параметр resourceId как параметр, так что один и тот же ресурс xml раздувается для всех детей в ListView
. Аналогично, если вы используете <include layout ...>
в своем xml, вы повторно используете идентификаторы вида.
Так что, если разработчики не используют стандартный, рекомендуемый подход, я не вижу, что есть много приложений, на самом деле удовлетворяющих требованию, чтобы все Views
имели уникальные идентификаторы.
Является ли этот вывод неправильным? Кроме того, что такое поведение onRestoreInstanceState
, если идентификаторы не все разные, и допустимо ли это поведение?
EDIT
Соответствующие цитаты появляются на странице http://developer.android.com/training/basics/activity-lifecycle/recreating.html и читать следующим образом:
Примечание: Для того, чтобы Android системы для восстановления состояния взглядов в Вашей деятельности, каждый вид сусло имеют уникальный идентификатор, предоставленный атрибутом android: id.
Внимание! Всегда вызывайте реализацию суперкласса onRestoreInstanceState(), поэтому реализация по умолчанию может восстановить состояние иерархии представлений.
Где вы это видите? Его нет в документации для onRestoreInstanceState. Мне также не имеет никакого смысла, насколько мне известно, что RRestoreInstanceState ничего не делает для вас - вам нужно восстановить каждый элемент вручную. –
Я тоже не могу найти его. Он определенно говорил это (как и в августе, когда я опубликовал аналогичный вопрос) большими жирными буквами! Это беспокоило меня какое-то время, но я не проверял недавно, поэтому, возможно, они изменили реализацию. Это определенно было правдой (см., Например, http://stackoverflow.com/q/6045361/3973077, среди многих других, которые обнаружили ту же проблему). Я был бы признателен, если бы эксперт мог подтвердить, что происходит. –
Это никогда не было в документации 'onRestoreInstanceState()'.Базовая реализация этого метода в 'View' предназначена для выброса' IllegalStateException' с сообщением об этом, если он вызывается с любым другим конкретным параметром, чем тот, который он сохраняет и ожидает: 'BaseSavedState.EMPTY_STATE'. Обычно это вызвано неправильной реализацией метода в пользовательском 'View'. – corsair992