본문 바로가기
📱| Android/🚀 | Jetpack

[Android, Kotlin] jetpack navigation에서 safe args로 데이터 전달하기

by immgga 2023. 9. 26.

 

최근 포스팅에서 compose에서 jetpack navigation을 이용할 때, data class type의 데이터를 넘기는 방법을 알아봤었다.

저 기술을 최근에 xml에서 한 번 더 사용할 일이 있었는데, 이름이 safe args라는 것을 알게 되었다.

아마 compose에서 사용한 기술도 safe args로 불리는 듯한다.

https://rkdrkd-history.tistory.com/57

 

[Android, Kotlin] compose navigation에서 data class tpye 넘기기

compose에서 navigation을 사용할 때, 화면 전환 시 변환될 화면에 기존의 화면의 데이터를 이용하고 싶은 경우가 있을 것이다. 그럴 때에는 Navcontroller.navigate()에다가 넘길 데이터를 param으로 넣은 다

rkdrkd-history.tistory.com

 

서론은 여기까지 하고

이번에는 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에서 비슷한 개념을 공부했었기에 생각보다 쉽게 사용할 수 있었다.

규모가 큰 프로젝트에서 유용하게 사용할 수 있을 것 같다.

 

올바르지 않은 정보나 코드가 존재하는 경우 피드백해주시면 감사하겠습니다.

 

참고한 글

https://philosopher-chan.tistory.com/1500

 

Jetpack Navigation - 5 (Safe Args)

개복치개발자 강의는 아래의 링크에서 확인할 수 있습니다. 개복치개발자 | Linktree uyalae@naver.com linktr.ee Navigation에서 Fragment끼리 데이터를 전달하는 방법에 대해 Bundle에 대해서 알아봤습니다. 그

philosopher-chan.tistory.com

728x90