안드로이드

[Android/Kotlin] safe-args, fragment간 navigation을 통해 인자를 주고 받기.

란서 2022. 5. 18. 15:20

Safe args, navigation.xml

네비게이션을 사용하여 프래그먼트간 인자를 주고받을 때 , 해당 프래그먼트의 네비게이션에 <argument>를 먼저 설정해줄 필요가 있다.

<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/main_navigation"
    app:startDestination="@+id/fragment_store_page">

    <fragment
        android:id="@+id/fragment_store_page"
        android:name="com.test.woowahan.activity.main.storepage.StorePageFragment"
        tools:layout="@layout/fragment_store_page"
        >
        <action
            android:id="@+id/action_storpageFragment_to_menuDetailFragment"
            app:destination="@+id/fragment_menu_detail"
            />
            
        <argument
		app:argType="int"
		android:name="key"/>

    </fragment>

    <fragment
        android:id="@+id/fragment_menu_detail"
        android:name="com.test.woowahan.activity.main.detail.MenuDetailFramgent"
        tools:layout="@layout/fragment_menu_detail">

        <argument
            app:argType="com.test.woowahan.data.Menus"
            android:name="menus"/>


    </fragment>
</navigation>

 

위 코드 처럼 <fragment> 태그 내에 <argument> 태그를 이용하여

전해줄 변수의
argType : 인자 타입

name : 변수 이름

을 정해줄 수 있다.

기본형은 int, string, boolean, long 등등 으로 이루어져있고,


parcelize, serailize 와 같은 맞춤 클래스는 사용할 수 없다.
따라서 다음과 같은 형식 불가능.

      <argument
            app:argType="com.test.woowahan.data.Menus"
            android:name="menus"/>

 

array는 사용할 수 있다.

 

      <argument
            app:argType="string[]"
            android:name="menus"/>



Kotlin

navigation.xml을 설정해줬다면 다음은 코드에서 네비게이션을 통해 이동할 때 인자를 넘기는 방식에 대해 알아보자

우선 인자를 넘기는 것 까지는 간단하게

 

val menus = Menus()
findNavController().navigate(
	FragmentStorePageDirections.~~~Action.navigate(menus = 넘겨줄 인자)
)

 

이런식으로 넘겨준다. 받는 쪽에서는

 

onCreateView() {

	//받는 쪽 fragment의 Args
	val args = MenuDetailFragmentArgs.fromBundle(this.arguments).menus

}

또는

private val args by navArgs<MenuDetailFragmentArgs>()

을 통해 args를 받아 

val menus = args.menus

 

처럼 사용할 수 있다.