MyTetra Share
Делитесь знаниями!
Аргументы фрагментов
20.04.2017
15:54
Раздел: Android - books - AndroidProgramming2e - 10 Аргументы фрагментов

Аргументы фрагментов

К каждому экземпляру фрагмента может быть прикреплен объект Bundle. Этот

объект содержит пары «ключ-значение», которые работают так же, как дополнения

интентов Activity. Каждая такая пара называется аргументом (argument).

Чтобы создать аргументы фрагментов, вы сначала создаете объект Bundle, а затем

используете put-методы Bundle соответствующего типа (по аналогии с методами

Intent) для добавления аргументов в пакет:

Bundle args = new Bundle();

args.putSerializable(EXTRA_MY_OBJECT, myObject);

args.putInt(EXTRA_MY_INT, myInt);

args.putCharSequence(EXTRA_MY_STRING, myString);


Почему для обновления RecyclerView переопределяется метод onResume(), а не

onStart()? Мы не можем предполагать, что активность останавливается при нахождении перед

ней другой активности. Если другая активность прозрачна, ваша

активность может быть только приостановлена. Если же ваша активность приостановлена,

а код обновления находится в onStart(), список не будет перезагружаться. В общем случае

самым безопасным местом для выполнения действий,

связанных с обновлением представления фрагмента, является метод onResume().

Запустите приложение CriminalIntent. Выберите преступление в списке и измените его подробную

информацию. Вернувшись к списку, вы немедленно увидите свои изменения.

За последние две главы приложение CriminalIntent серьезно продвинулось вперед.

Давайте взглянем на обновленную диаграмму объектов


Для любознательных: зачем использовать аргументы фрагментов?

Все это выглядит как-то сложно. Почему бы просто не задать переменную экземпляра в

CrimeFragment при создании?

Потому что такое решение будет работать не всегда. Когда ОС создает заново ваш

фрагмент (либо вследствие изменения конфигурации, либо при переходе пользователя к

другому приложению с последующем освобождением памяти ОС), все

переменные экземпляров теряются. Также помните о возможной нехватке памяти.

Если вы хотите, чтобы решение работало во всех случаях, придется сохранять аргументы.

Один из возможных вариантов — использование механизма сохранения состояния экземпляров.

Идентификатор преступления заносится в обычную переменную экземпляра, сохраняется вызовом

onSaveInstanceState(Bundle), а затем извлекается из Bundle в onCreate(Bundle). Такое решение будет работать всегда.

С другой стороны, оно усложняет сопровождение. Если вы вернетесь к фрагменту

через несколько лет и добавите еще один аргумент, нельзя исключать, что вы

забудете сохранить его в onSaveInstanceState(Bundle).

Разработчики Android предпочитают решение с аргументами фрагментов, потому

что в этом случае они предельно явно и четко обозначают свои намерения. Через несколько

лет вы вернетесь к коду и будете знать, что идентификатор преступления — это аргумент,

который надежно передается новым экземплярам этого

фрагмента. При добавлении нового аргумента вы знаете, что его нужно сохранить

в пакете аргументов.

 
MyTetra Share v.0.52
Яндекс индекс цитирования