FragmentTransaction
— это класс, который позволяет нам программно добавлять и удалять фрагменты. Он работает с бэкстэком точно так же, как тот, который используется в нашей деятельности. Все, что нам нужно, это ViewGroup
для хранения фрагментов.
Я собираюсь перечислить шаги, необходимые для работы с экземплярами FragmentTransaction
. Все фрагменты кода, которые я запишу, будут основаны на предположении, что в нашем xml-файле макета есть FrameLayout
с id fragmentcontainer, который содержит или будет содержать фрагменты, с которыми мы будем проводить транзакцию, и что ссылка на новый фрагмент называется newFragment.
Требуются следующие шаги:
- Создайте экземпляр
FragmentTransaction
в вашей деятельности. - Укажите изменения, которые должна включать транзакция.
- Добавьте транзакцию в стек.
- Зафиксируйте транзакцию.
Давайте рассмотрим каждый из этих шагов подробнее.
Создание фрагментной транзакции
Фрагментные транзакции создаются внутри действий. Чтобы создать FragmentTransaction
, вы вызываете метод beginTransaction()
на результат вызова getSupportFragmentManager()
.
Вы можете создать FragmentTransaction
с помощью приведенного ниже фрагмента кода:
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
Указание изменений в транзакции фрагмента
Фрагментная транзакция FragmentTransaction
может содержать различные изменения. Каждое изменение задается методом. Некоторые из этих методов: add()
, replace()
и remove()
.
add() и replace()
Метод add()
добавляет новый фрагмент в стек. В приведенном ниже фрагменте кода показано, как использовать этот метод:
transaction.add(R.id.fragmentcontainer, newFragment);
Метод replace()
заменяет существующий фрагмент на новый. В приведенном ниже фрагменте кода показано, как использовать этот метод:
transaction.replace(R.id.fragmentcontainer, newFragment);
Разбивка кода
Методы add()
и replace()
принимают два аргумента. Это:
-
id группы
ViewGroup
, содержащей фрагмент. -
Новый фрагмент, на который вы хотите добавить или заменить старый фрагмент.
В приведенных выше фрагментах кода transaction — это экземпляр FragmentTransaction
, fragmentcontainer — это идентификатор ViewGroup в нашей активности, содержащей фрагмент, а newFragment — это ссылка на новый фрагмент, который мы хотим добавить в стек или заменить им текущий.
remove()
Метод remove()
удаляет фрагмент из бэкстека фрагментов.
transaction.remove(currentFragment);
Разбивка кода
Метод remove принимает один аргумент — ссылку на фрагмент, который мы хотим удалить. Приведенный выше фрагмент кода удалит из бэкстека фрагмент, на который ссылается currentFragment.
Добавление FragmentTransaction в стек Backstack
Вы добавляете FragmentTransaction в стек с помощью метода addToBackStack()
.
Этот метод принимает один аргумент — строку, которую вы используете для обозначения транзакции на случай, если вам понадобится извлечь транзакцию программно.
transaction.addToBackstack("transaction_id");
В приведенном выше коде строка «transaction_id» может быть использована позже для извлечения транзакции. Вы также можете передать null в метод addToBackStack()
, если не хотите передавать строку.
Фиксация транзакции
Вы фиксируете транзакцию FragmentTransaction, вызывая метод commit()
для экземпляра транзакции.
transaction.commit();
Когда вы вызываете commit()
, изменения, которые вы сохранили в FragmentTransaction
, применяются к вашему приложению.
Резюме
Чтобы программно переключать фрагменты, выполните следующие действия:
- Создайте
FragmentTransaction
в вашей деятельности.
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
- Укажите изменения, которые должна включать транзакция.
transaction.add(R.id.fragmentcontainer, newFragment);
- Добавить транзакцию в стек.
transaction.addToBackstack("transaction_id");
- Зафиксировать транзакцию.
transaction.commit();
Предыдущая статья: Фрагменты списка
Следующая статья: Динамические фрагменты