0

Android Navigation

#Kotlin #Android
M
Matheus Miranda

Olá pessoal,

Recentemente finalizei o bootcamp Inter Android Developer e utilizei algumas práticas mais atuais e recomendadas pela Google, então resolvi falar um pouco sobre como implementei em meu app.

(Para quem estiver interessado, clique aqui para ver o app final.)


Então vamos falar sobre Navigation no Android com Fragments.


O que é?

Navigation é a maneira como o usuário pode navegar entre os diferentes conteúdos do seu app. Desde cliques simples em botões até itens de maior complexidade como o navigation drawer.


Por quê?

  • O componente de Navigation faz todo o trabalho de fragment transaction por você.
  • Ele cuidas das ações do botão de "voltar"
  • Permite customizar animações e transições
  • Safe Args: permite passagem de dados com type safety


Como implementar?

Vamos começar adicionando duas dependencias no build.gradle do modulo do app:

def navigationVersion = "2.3.5"
implementation "androidx.navigation:navigation-fragment-ktx:$navigationVersion"
implementation "androidx.navigation:navigation-ui-ktx:$navigationVersion"


Em seguida, clique com o botão direito em cima da pasta "res" e va em New > Android Resource File. Chame-a de "navigation", com o resource type "Navigation"


Agora precisamos de um "host", ou seja, precisamos de um container de fragments para que a nossa navigation possa fazer a troca entre os fragments para onde queremos navegar.

Abra seu activity_main.xml e substitua pelo código seguinte:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/myNavHostFragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:navGraph="@navigation/navigation"
        />

</layout>

O nome NavHostFragment é geralmente utilizado por padrão.

o app:navGraph está referindo ao xml de navigation que criamos no passo anterior e o app:defaultNavHost indica que esse é o host default e vai interceptar o botão de "voltar" do sistema.


Vamos voltar ao nosso navigation.xml (@navigation/navigation.xml) e clicar no botão de adicionar novos destinos e selecionar nossos fragments. (Aqui pressupõe que voce ja tenha criado seus layouts). No caso do app em questão, existem duas telas, porém ao adicionar mais, nossa vida fica bem mais fácil.


Agora clique no fragment que sera a tela inicial do seu app e pressione o "Home"


Depois faça uma ligação entre ambos, indicando a sequencia lógica de telas



Finalizando

Ufa! Agora fica muito fácil navegar entre suas telas.

Vamos voltar no código do fragment que foi definido como "Home".

Nesse caso, um clique na lista do recycler view precisa nos levar a tela de detalhes. Então eu criei uma função que recebi o item cilcado. Simplesmente chamamos o findNavController().navigate e passamos o id da action que vamos tomar. O nome já é bem intuitivo. Navegar com Intent nunca mais :D

private fun clickedListItem(item: Issue) {
     findNavController().navigate(R.id.action_issuesFragment_to_detailsFragment)
}


Bonus

O artigo já estendeu bastante, mas para complementar, se quisermos passar argumentos entre os fragments, é muito fácil também.

Nas dependcias o build.gradle do modulo do projeto, declaramos

classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$navigationVersion"


Com isso, não usaremos mais o Bundle para passar dados, pois ele pode nos dar erro de nome de chaves ou diferente tipo de dados, e esses erros não são capturados durante o compile.

Esse plugin vai gerar uma classe de "directions" para que possamos substituir no metodo do click, ficando assim:

private fun clickedListItem(item: Issue) {
    findNavController().navigate(
        IssuesFragmentDirections.actionIssuesFragmentToDetailsFragment())
}


Se quisermos passar argumentos, basta ir no @navigation/navigation.xml e na classe que vai receber os argumentos, declaramos o Name e Type: