Фрагмент представляет собой модульную часть пользовательского интерфейса в рамках действия. У фрагмента есть собственный жизненный цикл, он получает собственные входные события, и вы можете добавлять или удалять фрагменты во время выполнения содержащего их действия.
В этом документе описывается, как создать фрагмент и включить его в действие.
Настройка среды
Для фрагментов требуется зависимость от библиотеки AndroidX Fragment. Чтобы добавить эту зависимость, необходимо включить репозиторий Google Maven в файл settings.gradle проекта.
Яркий
dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() ... } }
Kotlin
dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() ... } }
Чтобы включить библиотеку AndroidX Fragment в проект, добавьте в файл build.gradle приложения следующие зависимости:
классный
dependencies { def fragment_version = "1.9.1" // Java language implementation implementation "androidx.fragment:fragment:$fragment_version" // Kotlin implementation "androidx.fragment:fragment-ktx:$fragment_version" }
Котлин
dependencies { val fragment_version = "1.9.1" // Java language implementation implementation("androidx.fragment:fragment:$fragment_version") // Kotlin implementation("androidx.fragment:fragment-ktx:$fragment_version") }
Создайте класс фрагмента
Чтобы создать фрагмент, расширьте класс AndroidX Fragment и переопределите его методы, чтобы вставить логику приложения, как при создании класса Activity. Чтобы создать минимальный фрагмент, определяющий собственный макет, предоставьте ресурс макета фрагмента базовому конструктору, как показано в следующем примере:
Kotlin
class ExampleFragment : Fragment(R.layout.example_fragment)
Java
class ExampleFragment extends Fragment { public ExampleFragment() { super(R.layout.example_fragment); } }
Библиотека Fragment также предоставляет более специализированные базовые классы фрагментов:
DialogFragment- Показывает плавающее диалоговое окно. Использование этого класса для создания диалогового окна – хорошая альтернатива вспомогательным методам диалогового окна в классе
Activity, поскольку фрагменты автоматически обрабатывают создание и очисткуDialog. Подробную информацию вы найдете в разделе Показ диалоговых окон с помощьюDialogFragment. PreferenceFragmentCompat- Показывает иерархию объектов
Preferenceв виде списка. С помощьюPreferenceFragmentCompatможно создать экран настроек для приложения.
Как добавить фрагмент в объект activity
Как правило, фрагмент должен быть встроен в FragmentActivity AndroidX, чтобы добавить часть интерфейса в макет этого действия. FragmentActivity – это базовый класс для AppCompatActivity. Если вы уже используете подкласс AppCompatActivity, чтобы обеспечить обратную совместимость в приложении, то вам не нужно менять базовый класс действия.
Добавить фрагмент в иерархию View объекта activity можно двумя способами: определить фрагмент в файле макета объекта activity или определить контейнер фрагмента в файле макета объекта activity, а затем программно добавить фрагмент из объекта activity. В любом случае вам нужно добавить FragmentContainerView, который определяет местоположение, где фрагмент должен быть размещен в иерархии View действия. Настоятельно рекомендуем всегда использовать FragmentContainerView в качестве контейнера для фрагментов, поскольку FragmentContainerView включает исправления, характерные для фрагментов, которые не предоставляют другие группы представлений, такие как FrameLayout.
Как добавить фрагмент с помощью XML
Чтобы добавить фрагмент в XML-код макета объекта activity, используйте элемент FragmentContainerView.
Ниже приведен пример макета действия, содержащего один элемент FragmentContainerView:
<!-- res/layout/example_activity.xml -->
<androidx.fragment.app.FragmentContainerView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.example.ExampleFragment" />
Атрибут android:name указывает название класса Fragment, экземпляр которого нужно создать. Когда макет объекта activity разворачивается, создается экземпляр указанного фрагмента, для него вызывается метод onInflate() и создается объект FragmentTransaction, чтобы добавить фрагмент в FragmentManager.
Как добавить фрагмент программно
Чтобы программно добавить фрагмент в макет объекта activity, макет должен включать FragmentContainerView, который будет служить контейнером фрагмента, как показано в следующем примере:
<!-- res/layout/example_activity.xml -->
<androidx.fragment.app.FragmentContainerView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
В отличие от подхода с XML, атрибут android:name здесь не используется в FragmentContainerView, поэтому конкретный фрагмент не создается автоматически. Вместо этого для создания экземпляра фрагмента и добавления его в макет объекта activity используется FragmentTransaction.
Пока действие выполняется, вы можете совершать транзакции с фрагментами, например добавлять, удалять или заменять их. В FragmentActivity можно получить экземпляр FragmentManager, который можно использовать для создания FragmentTransaction. Затем вы можете создать экземпляр фрагмента в методе onCreate() объекта activity с помощью FragmentTransaction.add(), передав идентификатор ViewGroup контейнера в макете и класс фрагмента, который нужно добавить, а затем зафиксировать транзакцию, как показано в примере ниже.
Kotlin
class ExampleActivity : AppCompatActivity(R.layout.example_activity) { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if (savedInstanceState == null) { supportFragmentManager.commit { setReorderingAllowed(true) add<ExampleFragment>(R.id.fragment_container_view) } } } }
Java
public class ExampleActivity extends AppCompatActivity { public ExampleActivity() { super(R.layout.example_activity); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState == null) { getSupportFragmentManager().beginTransaction() .setReorderingAllowed(true) .add(R.id.fragment_container_view, ExampleFragment.class, null) .commit(); } } }
В предыдущем примере обратите внимание, что транзакция фрагмента создается, только когда savedInstanceState имеет значение null. Это гарантирует, что фрагмент будет добавлен только один раз, когда действие будет создано впервые. Когда конфигурация меняется и действие создается заново, savedInstanceState больше не равно null и фрагмент не нужно добавлять повторно, так как он автоматически восстанавливается из savedInstanceState.
Если фрагменту требуются начальные данные, аргументы можно передать, указав Bundle в вызове FragmentTransaction.add(), как показано ниже.
Kotlin
class ExampleActivity : AppCompatActivity(R.layout.example_activity) { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if (savedInstanceState == null) { val bundle = bundleOf("some_int" to 0) supportFragmentManager.commit { setReorderingAllowed(true) add<ExampleFragment>(R.id.fragment_container_view, args = bundle) } } } }
Java
public class ExampleActivity extends AppCompatActivity { public ExampleActivity() { super(R.layout.example_activity); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState == null) { Bundle bundle = new Bundle(); bundle.putInt("some_int", 0); getSupportFragmentManager().beginTransaction() .setReorderingAllowed(true) .add(R.id.fragment_container_view, ExampleFragment.class, bundle) .commit(); } } }
Затем аргументы Bundle можно получить из фрагмента, вызвав requireArguments(), а для получения каждого аргумента можно использовать соответствующие методы получения Bundle.
Kotlin
class ExampleFragment : Fragment(R.layout.example_fragment) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { val someInt = requireArguments().getInt("some_int") ... } }
Java
class ExampleFragment extends Fragment { public ExampleFragment() { super(R.layout.example_fragment); } @Override public void onViewCreated(@NonNull View view, Bundle savedInstanceState) { int someInt = requireArguments().getInt("some_int"); ... } }
Дополнительная информация
Подробную информацию о транзакциях для работы с фрагментами и классе FragmentManager можно найти в руководстве по FragmentManager.