Создание гибкого интерфейса пользователя

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

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

использование фрагментов на различных устройствах

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

Класс FragmentManager предоставляет методы для добавления, удаления и замены фрагментов в явления во время работы приложения.

Добавление фрагмента в явление во время выполнения

Вместо добавления фрагментов в файл разметки, как мы это делали в предыдущем уроке применяя элемент <fragment>, вы можете добавлять фрагменты к явлениям во время выполнения. Обязательно применять такой подход, если вы планируете изменять фрагмент во время выполнения.

Чтобы добавить или удалить фрагмент, необходимо использовать FragmentManager для создания объекта FragmentTransaction, который предоставляет API для добавления, удаления, замены и выполнения других фрагментов.

Если явление позволяет удаление и замену фрагментов, необходимо добавить вставку первоначальных фрагментов в метод onCreate() нужного явления.

Явление обязательно должно содержать контейнер типа View, в который будут вставляться фрагменты, – главным образом это правило должно выполняться при добавлении фрагментов во время выполнения.

Ниже представлена разметка для отображения только одного фрагмента в момент времени. Для замены данного фрагмента другим, в явлении расположен пустой контейнер типа FrameLayout.

Обратите внимание, что имя файла такое же, как в прошлом уроке, однако файл располагается в директории без спецификатора large. Данная разметка будет использоваться на устройствах с маленькими экранами.

res/layout/news_articles.xml

Внутри явления вызовите метод getSupportFragmentManager() для получения экземпляра FragmentManager используя библиотеку поддержки. Вызов beginTransaction() создает экземпляр FragmentTransaction, а метод add() добавляет фрагмент.

Вы можете выполнить несколько действий с фрагментами внутри явления, используя тот же самый экземпляр FragmentTransaction. Чтобы применить все изменения, необходимо вызвать метод commit().

Пример добавления фрагмента в предыдущую разметку:

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

Замена одного фрагмента другим

Процедура замены фрагмента аналогична добавлению, просто используется метод replace() вместо метода add().

Имейте ввиду, что если вы используете операции с фрагментами, такие как добавление или удаление, есть смысл разрешить пользователю перемещаться обратно или отменять изменения. Чтобы разрешить пользователю перемещаться обратно, нужно вызвать метод addToBackStage() перед тем как применить изменения объекта FragmentTransaction.

Примечание:при удалении или замене фрагмента во время операции возвращения в предыдущее состояние, удаленные фрагменты переходят в состояние остановлен (не уничтожен). Когда пользователь возвращается к фрагменту, он перезапускается. Если вы не используете операцию возврата (прим. переводчика: не вызываете addToBackStage()), фрагмент будет уничтожен после удаления.

Пример замены одного фрагмента другим:

Метод addToBackStage() принимает необязательный строковый параметр, содержащий уникальное имя транзакции. Этот параметр может применяться в случае, если вы планируете выполнять расширенные операции фрагмента, используя API FragmentManager.BackStackEntry

Добавить комментарий