프레임워크/Android

Jetpack Navigation Safeargs 사용법

Julie825 2022. 11. 29. 10:16

navigation에서 argument는 프래그먼트에게 속성을 붙여주는 것과 비슷하다.

fragment별로 앱바 종류를 argument에 저장해서 다른 앱바를 적용하게 할 수도 있고(Android10B MainActivity 참고)

다른 프래그먼트로부터 받을 데이터가 있으면 그걸 argument로 저장해서 받을 자리를 만들 수도 있다.(argument가 마치 우유 바구니같은 역할을 하는 것)

그러나 safe args를 통해 전달하는 데이터는 가능한 작은 값이어야한다.

ex) 어떤 object를 줘야할 때, 오브젝트 대신 그 오브젝트를 찾을 수 있는 key 값이나 인덱스를 준다.

만약 대량의 데이터를 공유하는 화면인 경우 같은 뷰모델을 사용하는 것을 고려하자.

우리가 하는 디테일 정보 표시같은 경우 작은 정보로 봐도 될 것 같다.

방법은 아주 간단해서 아래 주의사항만 지키면 된다.

  1. 프로젝트수준 build.gradle을 아래와 같이 설정
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    repositories {
        google()
    }
    dependencies {
        def nav_version = "2.5.3"
        classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
    }
}
plugins {
    id 'com.android.application' version '7.3.0' apply false
    id 'com.android.library' version '7.3.0' apply false
    id 'org.jetbrains.kotlin.android' version '1.7.10' apply false
    id 'com.google.dagger.hilt.android' version '2.44' apply false
}

2. 출발지에서는 action만 정의하고, 도착지에서 argument를 정의하기

// mobile_navigation.xml
<fragment
        android:id="@+id/navigation_shopping"
        android:name="com.example.boostsearch.ui.shopping.ShoppingFragment"
        android:label="쇼핑"
        tools:layout="@layout/fragment_shopping" >
    <action
            android:id="@+id/action_navigation_shopping_to_navigation_shoppingDetail"
            app:destination="@id/navigation_shoppingDetail"/>
</fragment>
<fragment
        android:id="@+id/navigation_shoppingDetail"
        android:name="com.example.boostsearch.ui.shoppingdetail.ShoppingDetailFragment"
        android:label="쇼핑"
        tools:layout="@layout/fragment_shopping_detail">
    <argument
            android:name="detail"
            app:argType="com.example.boostsearch.domain.model.ShoppingItemPreview"
            app:nullable="false" />
</fragment>

3. 사용하는 클래스 이름은 각각 아래와 같다.

 

출발지 : 출발지 이름 + Directions ex) FragmentItemListDirections

도착지: 도착지 이름 + Args ex) val args : FragmentItemDetailArgs by navArgs()

 


참고한 자료

https://developer.android.com/guide/navigation/navigation-pass-data?hl=ko

https://velog.io/@kkaemi/android-Navigation-Safe-Args를-사용하여-Fragment간-데이터전달