2016-03-14 3 views
0

У меня есть пользовательский вид, который я всегда создаю в коде и добавляю в иерархию представлений в коде, поэтому он никогда не включается из xml (я знаю, что следующий человек, поддерживающий мой код после того, как захочет использовать его из xml, но давайте предположим для простоты, что этого никогда не произойдет).Android: пользовательский вид не используется «из xml» должен иметь конструкторы по умолчанию?

В моем представлении нет стандартных конструкторов (Contex), (Context, AttributeSet)), у моего конструктора есть дополнительные параметры. Это нормально? Я знаю, что стандартные конструкторы будут вызываться, когда представление включено из XML, но, как упоминалось выше, я не использую представление из xml. У меня есть сомнения, что произойдет, если будет ситуация с низкой памятью, моя активность будет убита, но сохранена иерархия представлений - не будут ли эти конструкторы нужны, поскольку Android вызывает их при повторном создании экземпляров просмотров? Я тестировал это, устанавливая в симуляторе, чтобы убивать действия, когда я их оставляю - несмотря на отсутствие этих конструкторов по умолчанию, мое приложение не падает, и пользовательский вид выглядит нормально. Мое сомнение по-прежнему существует, так как я не знаю, как это работает.

Другими словами, мой вопрос: 1. В описанной выше ситуации, в какой форме сохраняется иерархия вида? Это просто сериализован? Написано в XML? Любым другим путем? 2. Когда воссоздана иерархия представлений, как воссозданы объекты вида (конструктор по умолчанию называется конструктором с аргументом контекста? Некоторый другой способ?)

Спасибо!

+1

Я никогда не слышал о '" просмотре объектов отдыха "': вам нужно построить дерево просмотра, когда 'Activity # onCreate' вызывается снова – pskink

+0

Если вы проверите здесь http://developer.android.com/training/basics/activity -lifecycle/recreating.html # SaveState вы увидите, что «по умолчанию реализация этого метода сохраняет информацию о состоянии иерархии представлений активности, такую ​​как текст в виджетах EditText или позиции прокрутки ListView». Похоже, что некоторая информация о иерархии представлений сохраняется, и мой вопрос в основном состоит в том, как именно реальные экземпляры представлений воссоздаются из этой сохраненной информации, какие конструкторы вызываются в процессе и т. Д. –

ответ

0

В описанной выше ситуации, в какой форме сохраняется иерархия вида?

Не сохраняется.

Когда иерархия зрения воскресает, как просмотреть объекты воссозданы

К однако код создает их.

. Пользовательский вид не используется «из xml» должен иметь конструкторы по умолчанию?

Вам нужен любой конструктор (ы), который вы используете. Для инфляции макета требуется двухпараметрический конструктор (Context, AttributeSet), последний раз я проверил. Но, если вы не используете это, вам не нужно его реализовывать.

+0

Пожалуйста, проверьте мой комментарий выше, где я даю ссылку в документацию Android о сохранении состояния просмотра - вот что я имею в виду. –

+0

@LukaszIndyk: View * state *! = View * hierarchy *. Состояние представления удерживается в другом процессе в виде серии объектов Parcelable. Android не восстанавливает иерархию представлений после изменения конфигурации или завершения процесса. Тем не менее, Android попытается восстановить состояние представления после того, как вы восстановили иерархию представления, для тех вещей, которые указаны в документации, которую вы цитируете (например,, текст в «EditText»). – CommonsWare

+0

Хорошо, спасибо. Можете ли вы описать, как именно Android восстанавливает состояние просмотра? Я имею в виду, что в какой-то момент у меня была моя активность и взгляды, они были уничтожены из-за нехватки памяти, во время уничтожения текст в EditText был сохранен Android. Затем я возвращаюсь к своей деятельности, вызывается onCreate, я создаю свои представления так же, как и изначально, и имею их, но они пустые. Как предыдущий текст в EditText, который теперь является новым экземпляром, инициализируется из сохраненного состояния? –