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
처럼 사용할 수 있다.