O Google tem o compromisso de promover a igualdade racial para as comunidades negras. Saiba como.

Criar gráficos de navegação

O componente de navegação usa um gráfico de navegação para gerenciar a navegação do seu app. Um gráfico de navegação é um arquivo de recursos que contém todos os destinos do app, com as conexões lógicas, ou ações, que os usuários podem realizar para navegar de um destino para outro. Você pode gerenciar o gráfico de navegação do seu app usando o Navigation Editor no Android Studio.

Este tópico contém práticas recomendadas e recomendações para criar gráficos de navegação do seu app.

Gráfico de navegação de nível superior

O gráfico de navegação de nível superior do seu app precisa começar com o destino inicial que o usuário vê ao iniciar o app e incluir os destinos que vê quando se movimenta pelo app.

Figura 1: um gráfico de navegação de nível superior.

Gráficos aninhados

Fluxos de login, assistentes ou outros subfluxos no seu app geralmente são mais bem representados como gráficos de navegação aninhados. Aninhando fluxos de subnavegação autocontidos dessa forma, fica mais fácil de compreender e gerenciar o fluxo principal da IU do seu app. Além disso, os gráficos aninhados são reutilizáveis. Eles também fornecem um nível de encapsulamento; os destinos fora do gráfico aninhado não têm acesso direto a nenhum destino no gráfico aninhado. Em vez disso, eles precisam navigate() até o gráfico aninhado, onde a lógica interna pode mudar sem afetar o resto do gráfico.

Usando o gráfico de navegação de nível superior da Figura 1 como exemplo, suponha que você queira exigir que o usuário veja as telas title_screen e register somente quando o app for iniciado pela primeira vez. Em seguida, as informações do usuário são armazenadas e, em lançamentos subsequentes do app, você precisará levá-las diretamente para a tela match. Como prática recomendada, defina a tela match como o destino inicial do gráfico de navegação de nível superior e mova as telas de título e registro para um gráfico aninhado, conforme mostrado na figura 2:

Figura 2: o gráfico de navegação de nível superior agora contém um gráfico aninhado.

Quando a tela de correspondência for iniciada, você poderá verificar se há um usuário registrado. Se o usuário não estiver registrado, você poderá navegar até a tela de registro. Para saber mais sobre cenários de navegação condicional, consulte Navegação condicional.

Outra maneira de modularizar a estrutura do seu gráfico é incluir um gráfico dentro de outro por meio de um elemento <include> no gráfico de navegação pai. Isso permite que o gráfico incluído seja definido em um módulo ou projeto separado, o que maximiza a capacidade de reutilização.

Se seu app depender de módulos da biblioteca, que têm um gráfico de navegação contido nele, você poderá referir-se a esses gráficos de navegação usando um elemento <include>.

Com base no exemplo de jogo de curiosidades, digamos que você queira separar as partes do app voltadas ao jogo em um módulo de biblioteca separado para incluir as telas in_game, results_winner e game_over em vários apps, conforme mostrado no exemplo a seguir.

<!-- App Module Navigation Graph -->
    <navigation xmlns:android="http://schemas.android.com/apk/res/android"
               xmlns:app="http://schemas.android.com/apk/res-auto"
               xmlns:tools="http://schemas.android.com/tools"
               app:startDestination="@id/match">

       <fragment android:id="@+id/match"
               android:name="com.example.android.navigationsample.Match"
               android:label="fragment_match">

           <!-- Launch into In Game Modules Navigation Graph -->
           <action android:id="@+id/action_match_to_in_game_nav_graph"
               app:destination="@id/in_game_nav_graph" />
       </fragment>

       <include app:graph="@navigation/in_game_navigation" />

    </navigation>
    
<!-- Game Module Navigation 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">

       <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" >

           <!-- 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" />

       </fragment>

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

          <!-- 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" />

     </fragment>

    </navigation>
    

Você precisa incluir o gráfico de nível superior no módulo principal do app e ter uma referência do Gradle para os módulos que contêm a navegação que você precisa consultar.

Ações globais

Qualquer destino no seu app que possa ser acessado por meio de mais de um caminho precisa ter uma ação global correspondente definida para navegar até esse destino. As ações globais podem ser usadas para navegar até um destino a partir de qualquer lugar.

Vamos aplicar isso ao módulo de biblioteca de exemplo, que tem a mesma ação definida nos destinos de vitória e de fim de jogo. Você precisa extrair essas ações comuns para uma única ação global e referenciá-las em ambos os destinos, conforme mostrado no exemplo a seguir.

<?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>
    

Consulte Ações globais nos documentos de navegação para saber mais e ver exemplos de como usar ações globais nos seus fragmentos.