Главная » Разработка для Android » ТРАНЗАКЦИИ ФРАГМЕНТА – программирование Android

0

 

Кроме применения тегирования, новый код также касается транзакций фрагментов. Еще раз дополним приложение, чтобы продемонстрировать ценность таких транзакций.

Прежде чем приниматься за транзакции, необходимо сделать небольшое отступление. Ранее мы отмечали, что в документации по разработке для Android рекомендуется, чтобы подклассы фрагмента не имели явных конструкторов. Итак, как же внешний объект передает состояние инициализации новому фрагменту? Класс Fragment поддерживает два метода, setArguments и getArguments, обеспечивающих такую возможность. Соответственно они позволяют внешнему вызывающему элементу – им может быть создатель фрагмента – сохранять пакет (Bundle) во фрагменте, а фрагменту – восстанавливать этот пакет когда-нибудь позднее.

Такая тонкая комбинация нового экземпляра фрагмента, пакета Bundle и вызова к setArguments работает во многом так же, как и конструктор. Поэтому целесообразно объединять эти элементы в статический фабричный метод, относящийся к объекту Fragment, вот так:

Теперь этот статический фабричный метод можно использовать в методе onCreate класса SimpleFragment для создания нового экземпляра фрагмента, который будет корректно инициализирован переданным пакетом Bundl е. Данный код практически идентичен предыдущей версии, за исключением того, что теперь используется статический фабричный метод, относящийся к DateTime, и ему передается аргумент:

Наконец, относящийся к фрагменту метод onCreate получает данные для инициализации из пакета, переданного в качестве аргумента, если только речь не идет о состоянии из предыдущей инкарнации метода:

Приложение, модифицированное до такой степени, все еще работает так же, как и исходный вариант. Но реализация значительно изменилась и стала гораздо более гибкой. В частности, у нас есть фрагмент, который можно инициализировать извне и использовать для демонстрации транзакций.

Идея транзакции фрагмента, как следует из названия, заключается в том, что все изменения происходят в результате единичного, «атомарного» действия. Чтобы это продемонстрировать, в последний раз дополним нашу программу-пример: добавим возможность создавать фрагменты в парах.

Вот новый макет:

Вот соответствующие дополнения к методу onCreate в Simpl eFragment:

Наконец, изменяется и наше приложение-пример. Теперь при запуске оно выглядит как на рис. 8.2.

Рис. 8.2. Транзакции фрагмента

Оба фрагмента отображают одни и те же дату и время, так как обоим фрагментам сообщается одинаковое значение. Теперь можно прерываться на работу с другими приложениями, а потом возвращаться к нашей программе-примеру, можно поворачивать дисплей – наше демо не потеряет состояния. Программа довольно надежная. Сделаем реализацию кнопки:

Этот метод использует именно атомарность транзакций фрагмента. Он во многом напоминает код инициализации фрагмента из метода onCreate, относящегося к Simpl eFragment. Но вместо того, чтобы использовать транзакции для добавления новых экземпляров фрагмента, этот код замещает существующие фрагменты. Вызов commi t в конце метода приводит к тому, что оба новых фрагмента становятся видимы одновременно. Время в голубом и зеленом поле всегда будет идти синхронно.

Итак, мы подходим к последней важной составляющей фрагмента – стеку переходов назад (back stack). Если последовательно запустить несколько активностей, то к ним можно будет вернуться в обратном порядке, воспользовавшись кнопкой «Назад». Такое поведение свойственно и для транзакций фрагмента.

Запустив это приложение, вы увидите на экране картинку, как на рис. 8.2. Если нажать кнопку, расположенную в верхней части экрана, то голубой и зеленый фрагменты одновременно обновятся. Но еще лучше, если вы нажмете кнопку «Назад» (значок со стрелкой, указывающей влево, в нижнем левом углу дисплея), – вы увидите в обратном порядке все обновления, которые сделали, нажимая кнопку «Пуск». Например, если в обоих фрагментах отображается время 5 Apr 2011 12:49:32, а вы нажимаете кнопку «Пуск», то дисплей может обновиться так, что в обоих фрагментах – голубом и зеленом – будут показаны дата и время 5 Apr 2011 13:02:43. Если после этого нажать кнопку «Назад», то в обоих фрагментах опять будет показано время 5 Apr 2011 12:49:32. Целая транзакция – обновление обоих фрагментов – записывается в стек переходов назад как единое событие. Когда вы нажимаете кнопку «Назад», целая транзакция удаляется, открывая состояние, которое наступило в результате предыдущей транзакции.

Источник: Android. Программирование на Java для нового поколения мобильных устройств

По теме:

  • Комментарии