Navigation 설정 및 사용(Kotlin)

소개



Navigation 설정 방법과 사용법을 소개합니다.

「Navigation」이란?



Google이 제공하는 Jetpack의 구성 요소입니다.
프래그먼트 간의 전이와 같은 다양한 네비게이션 구현에 유용합니다.

환경


  • OS: macOS Big Sur 11.5.2
  • Android Studio: Arctic Fox | 2020.3.1
  • Kotlin: 1.5.21
  • Gradle: 7.0.2
  • Gradle plugin: 7.0.0
  • Navigation: 2.3.5

  • 설정



    Navigation 설치



    루트 바로 아래의 "build.gradle"에 Navigation 버전을 추가합니다.

    다른 기사에서 소개할 예정입니다만, Navigation과 병용해 「Safe Args」라고 하는 Gradle 플러그인을 사용하는 경우가 많습니다.
    따라서 먼저 Navigation 버전을 상수화했습니다.

    /build.gradle
    buildscript {
        ext {
    +       nav_version = '2.3.5'
        }
    }
    

    app 폴더 아래의 'build.gradle'에 종속성을 추가합니다.

    /app/build.gradle
    dependencies {
    +   // Navigation
    +   implementation "androidx.navigation:navigation-fragment-ktx:$rootProject.nav_version"
    +   implementation "androidx.navigation:navigation-ui-ktx:$rootProject.nav_version"
    }
    

    이것으로 Navigation 설정이 완료됩니다.

    용어



    Navigation에 사용되는 용어를 소개합니다.


    용어
    설명


    네비게이션
    목적지 간 이동

    목적지
    앱 내에서 이동할 수 있는 위치(활동 및 조각)

    액션
    목적지 간의 연결


    사용법



    네비게이션 그래프 만들기



    탐색 그래프는 대상과 작업을 저장하는 리소스 파일입니다.

    Project > res 폴더를 마우스 오른쪽 버튼으로 클릭 > New > Android Resource File


    파일 이름에 nav_graph와 같은 이름을 입력합니다. 네비게이션 그래프를 복수 작성하는 경우는 ○○_nav_graph 라고 명명하면 됩니다.
    리소스 유형으로 탐색을 선택하고 확인 버튼을 누릅니다.


    네비게이션 그래프 구현



    네비게이션 그래프 파일을 만든 후 내용을 구현합니다.

    다음은 MainFragment 에서 OssLicensesMenuActivity 로 전환하는 단순한 탐색 그래프입니다.

    nav_graph.xml
    <?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"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/nav_graph"
        app:startDestination="@id/main_fragment">
    
        <fragment
            android:id="@+id/main_fragment"
            android:name="com.theuhooi.uhooipicbook.ui.main.MainFragment"
            android:label=""
            tools:layout="@layout/main_fragment">
            <action
                android:id="@+id/action_main_to_licenses"
                app:destination="@id/licenses_activity" />
        </fragment>
    
        <activity
            android:id="@+id/licenses_activity"
            android:name="com.google.android.gms.oss.licenses.OssLicensesMenuActivity" />
    
    </navigation>
    

    네비게이션, 단편 및 활동은 id초기 표시할 대상은 app:startDestinationid 로 지정합니다.

    Android Studio가 자동으로 미리 보기 때문에 매우 이해하기 쉽습니다.
    화살표가 액션입니다.


    활동에 내비게이션 호스트 추가



    탐색 그래프를 구현한 후 활동에 탐색 호스트를 추가합니다.
    탐색 호스트는 빈 컨테이너이며 전환할 때마다 컨테이너 내에서 대상이 바뀝니다.

    여기서는 시작 대상으로 지정한 MainFragment의 부모인 MainActivity에 전체 탐색 호스트를 표시합니다.

    main_activity.xml
    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout 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"
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    
        <androidx.fragment.app.FragmentContainerView
            android:id="@+id/nav_host_fragment"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_width="0dp"
            android:layout_height="0dp"
            app:defaultNavHost="true"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:navGraph="@navigation/nav_graph" />
    
    </androidx.constraintlayout.widget.ConstraintLayout>
    

    이제 MainFragment를 볼 수 있습니다.

    네비게이션 처리 구현


    MainFragment 로부터 OssLicensesMenuActivity 에의 네비게이션 처리를 구현합니다.

    Safe Args 설정이 필요하므로 아래 기사를 참조하십시오.
    htps : // 코 m / 보라 / ms / b73911 A fdc62 Ae 188 A 3b

    네비게이션 그래프로부터 자동으로 MainFragmentDirections.actionMainToLicenses() 라고 하는 메소드가 생성되므로, 그 반환값 (액션)을 findNavController().navigate() 메소드의 인수에 건네주어 호출할 뿐입니다.

    MainFragment.kt
    class MainFragment : Fragment() {
        fun foo() {
            findNavController().navigate(MainFragmentDirections.actionMainToLicenses())
        }
    }
    

    이것만으로 네비게이션 처리를 구현할 수 있습니다.

    결론



    Navigation을 사용하여 단편과 액티비티 간의 화면 전환을 간단하게 실현할 수 있었습니다!

    참고 링크


  • 탐색  | Android 개발자  | Android Developers
  • Navigation 구성 요소 시작 가이드  | Android 개발자  | Android Developers
  • 좋은 웹페이지 즐겨찾기