2014-12-15 2 views
0

Руководство разработчика для разработчиков 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(), поэтому реализация по умолчанию может восстановить состояние иерархии представлений.

+0

Где вы это видите? Его нет в документации для onRestoreInstanceState. Мне также не имеет никакого смысла, насколько мне известно, что RRestoreInstanceState ничего не делает для вас - вам нужно восстановить каждый элемент вручную. –

+0

Я тоже не могу найти его. Он определенно говорил это (как и в августе, когда я опубликовал аналогичный вопрос) большими жирными буквами! Это беспокоило меня какое-то время, но я не проверял недавно, поэтому, возможно, они изменили реализацию. Это определенно было правдой (см., Например, http://stackoverflow.com/q/6045361/3973077, среди многих других, которые обнаружили ту же проблему). Я был бы признателен, если бы эксперт мог подтвердить, что происходит. –

+0

Это никогда не было в документации 'onRestoreInstanceState()'.Базовая реализация этого метода в 'View' предназначена для выброса' IllegalStateException' с сообщением об этом, если он вызывается с любым другим конкретным параметром, чем тот, который он сохраняет и ожидает: 'BaseSavedState.EMPTY_STATE'. Обычно это вызвано неправильной реализацией метода в пользовательском 'View'. – corsair992

ответ

1

AdapterView (базовый класс для всех ViewGroup с, которые используют в Adapter) осуществляется таким образом, чтобы не сохранить или восстановить состояние его ребенка View с, так как это домен Adapter и должны быть обработаны на этом уровне ,

Что касается случая sublayout, который статический включен в нескольких точках, если это имеет какое-либо состояние будет сохранено, то вам нужно будет либо назначить уникальные идентификаторы для всех сохраняющего состояния View с, или управлять состоянием вручную из Activity или Fragment.

К сожалению, идентификаторы должны быть уникальными по всей структуре View, а не только среди его братьев и сестер. Это связано с тем, что состояние всей структуры сохраняется внутри одного одномерного SpareArray. Таким образом, если в структуре, имеющей один и тот же идентификатор, имеется несколько состояний View, то будет сохранено только состояние последнего в структуре, и оно будет применено ко всем View с этим идентификатором при восстановлении состояния.

+0

Спасибо. Это очень убедительный ответ. Я был введен в заблуждение ужасной документацией андроида (не в первый раз!). На странице, на которой я ссылаюсь, действительно следует упомянуть, что уникальное требование идентификатора не относится к дочерним элементам «AdapterView». –

Смежные вопросы