최근 포스팅에서 compose에서 jetpack navigation을 이용할 때, data class type의 데이터를 넘기는 방법을 알아봤었다.
저 기술을 최근에 xml에서 한 번 더 사용할 일이 있었는데, 이름이 safe args라는 것을 알게 되었다.
아마 compose에서 사용한 기술도 safe args로 불리는 듯한다.
https://rkdrkd-history.tistory.com/57
서론은 여기까지 하고
이번에는 xml에서 jetpack navigation을 사용하면서 safe args을 사용한 과정을 기록해 볼까 한다.
1. 라이브러리 추가
project 단위의 gradle에 다음과 같이 추가해 주자(2023. 09. 26 기준)
buildscript {
dependencies {
classpath("androidx.navigation:navigation-safe-args-gradle-plugin:2.7.3")
}
}
app 단위 gradle에도 추가해 주어야 한다.(2023. 09. 26 기준)
implementation("androidx.navigation:navigation-fragment-ktx:2.7.3")
implementation("androidx.navigation:navigation-ui-ktx:2.7.3")
2. 데이터 넘기기
데이터를 넘기려면 일단 넘길 데이터를 만들어 주어야 한다.
navigation 디렉터리 안에 만든 navigation 파일에서 생성한 fragment를 클릭하면 다음과 같은 정보가 뜰 것이다.
저 메뉴에서 arguments 메뉴를 찾아 플러스(+) 아이콘을 눌러 데이터를 생성한다.
플러스(+) 아이콘을 누르면 다음과 같은 대화 상자가 뜨는데, 저기서 name과 type을 지정하고 default type을 입력해 주면
navigation xml 코드에 자동으로 <argument>가 만들어질 것이다.
name에 빨간 줄이 뜨는 것은 그냥 내버려 두어도 아무 문제없으니까 넘어가도 된다.
그다음 단계는 자신이 navigation xml 파일에 추가한 fragment로 가서 fragmentDirections이 존재하는지 확인해 보자.
2-1. 데이터를 보내는 쪽의 처리
예를 들어 FirstFragment의 fragmentDirection은 FirstFragmentDirections가 된다.
fragmentDirections가 존재하지 않는다면 프로젝트를 clean 후 rebuild 해주자.
이제 fragmentDirections를 이용해서 다른 fragment에 데이터를 보내주는 작업을 할 것이다.
val action = FirstFragmentDirections.actionFirstFragmentToSecondFragment(a = "abc")
binding.btn1.setOnClickListener {
Navigation.findNavController(view).navigate(action)
}
action을 fragmentDirections를 이용해 따로 생성해 주었고, navigate 되는 함수 안에 이전에 생성한 arguments의 value를 넣어서 데이터를 전달할 수 있다.
위의 코드의 예시는 이전에 생성한 name이 a인 arguments에 문자열 abc를 전달해 주는 작업을 해주는 것이다.
위의 action 변수를 만들어주고 나면 기존에 navigate() 안의 값을 생성한 action을 넣어 준다.
2-2. 데이터를 받는 쪽의 처리
마지막으로 데이터를 받는 fragment에서 해야 하는 작업이 있다.
데이터를 받기 위한 fragmentArgs를 만들어 준다.
fragmentArgs도 fragmentDirections와 같이 SecondFragment의 fragmentArgs는 SecondFragmentArgs가 된다.
val args : SecondFragmentArgs by navArgs()
이제 생성한 args를 이용해 데이터를 사용해 주면 된다.
val text = args.a
binding.textView.text = text
이전에 생성한 a라는 argument를 args 변수를 이용해 사용할 수 있다.
정리
이번에 jetpack navigation에서 fragment 끼리 데이터를 주고받을 수 있는 safe args를 사용해 보았다.
이전에 compose에서 비슷한 개념을 공부했었기에 생각보다 쉽게 사용할 수 있었다.
규모가 큰 프로젝트에서 유용하게 사용할 수 있을 것 같다.
올바르지 않은 정보나 코드가 존재하는 경우 피드백해주시면 감사하겠습니다.
참고한 글
'📱| Android > 🚀 | Jetpack' 카테고리의 다른 글
[Android, Kotlin] Compose에서 glance를 이용해 위젯 만들기 (0) | 2023.10.06 |
---|---|
[Android, Kotlin] compose custom theme 만들기 (0) | 2023.08.18 |
[Android, Kotlin] compose로 custom checkbox 만들기 (0) | 2023.08.18 |
[Android, Kotlin] compose로 tablayout 구현하기 (2) | 2023.08.15 |
[Android, Kotlin] compose navigation에서 data class tpye 넘기기 (2) | 2023.08.11 |