Используйте действия навигации и фрагменты

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

Обзор

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

Примеры

Определите действия в XML-файле графа навигации с помощью тегов <action> . Следующий фрагмент реализует действие, которое представляет переход от FragmentA к FragmentB .

<fragment
    android:id="@+id/fragmentA"
    android:name="com.example.FragmentA">
    <action
        android:id="@+id/action_fragmentA_to_fragmentB"
        app:destination="@id/fragmentB" />
</fragment>

Для навигации с помощью этого действия вы вызываете NavController.navigate() и передаете ему id действия:

navController.navigate(R.id.action_fragmentA_to_fragmentB)

Глобальные действия

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

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

Рассмотрим следующий пример. Оба пункта назначения results_winner и game_over должны отображаться в домашнем пункте назначения. Действие action_pop_out_of_game предоставляет возможность сделать это; action_pop_out_of_game — это глобальное действие вне какого-либо конкретного фрагмента. Это означает, что вы можете ссылаться на него и вызывать его в любом месте in_game_nav_graph .

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   android:id="@+id/in_game_nav_graph"
   app:startDestination="@id/in_game">

   <!-- Action back to destination which launched into this in_game_nav_graph -->
   <action android:id="@+id/action_pop_out_of_game"
                       app:popUpTo="@id/in_game_nav_graph"
                       app:popUpToInclusive="true" />

   <fragment
       android:id="@+id/in_game"
       android:name="com.example.android.gamemodule.InGame"
       android:label="Game">
       <action
           android:id="@+id/action_in_game_to_resultsWinner"
           app:destination="@id/results_winner" />
       <action
           android:id="@+id/action_in_game_to_gameOver"
           app:destination="@id/game_over" />
   </fragment>

   <fragment
       android:id="@+id/results_winner"
       android:name="com.example.android.gamemodule.ResultsWinner" />

   <fragment
       android:id="@+id/game_over"
       android:name="com.example.android.gamemodule.GameOver"
       android:label="fragment_game_over"
       tools:layout="@layout/fragment_game_over" />

</navigation>