View

Jetpack Navigation (safe args)

제롱구리 2024. 3. 22. 01:00
728x90

금일 알아 볼 것

Jetpack Navigation 의 데이터 전송 방식 중 하나인 safe args를 알아보려고 한다.


Jetpack Navigation safe args

일단 해당 safe args를 사용하기 위해서는
build.gradle 파일과 classpath가 필요하다.
[build.gradle]

buildscript {
    repositories {
        google()
    }
    dependencies {
        def nav_version = "2.7.7"
        classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
    }
}

아래 부부은 둘 중 하나만 추가한다.
자바 모듈 또는 자바와 Kotlin 혼합 모듈에 적합한 자바 언어 코드를 생성하려면 앱 또는 모듈의 build.gradle 파일에 다음 행을 추가한다.

[classpath](build.gradle파일 안에 있다.)

plugins {
  id 'androidx.navigation.safeargs'
}

kotlin 전용 모듈에는

plugins {
  id 'androidx.navigation.safeargs.kotlin'
}

이렇게 둘 중 하나를 추가 했으면 일단 설정은 끝



자 이제 부터 CreateQnaFragment와 categoryFragment를 예시로 들어가 사용법을 알아 보겠다.
위에 2개의 Fragment는 CreateQnaFragment에서 categoryFragment로 화면이 전환된다.

일단 들어가기 앞써서 어떻게 전달하는지 알아보자
일단 공식 문서의 개념이 나와있다.(2개를 알려 줄겡 알고 싶으면 보고 왕!)
공식문서1
공식문서2

해당 공식 문서를 자세히 읽어 봤다면 알 수 있을 것이다. 그래도 간단히 설명하자면
Jetpack Navigation을 사용하여 2개의 Fragment를 연결했다면 Action을 기준으로
데이터를 발신하는 Fragment에는 발신Fragment이름 + Directions(예시: CreateQnaFragmentDirections)
데이터를 받는 Fragment 에는 수신Fragment이름 + Args(예시: categoryFragmentArgs) 가 자동적으로 생성되고
데이터를 Action에 의해서 화면전환 할 때 같이 태워서 navigate() 메서드에 매개변수로 보낼 수 있다는 것이다.

하지만 데이터를 보내기 전에 받는 쪽에서 어떤 타입의 데이터를 받을지 설정해줘야 된다. 그래서 Navigationgraph에 argument라고 하는 xml코드를 추가해줘야된다.!!!



하나 하나씩 따라가 보자

일단 기본적으로 Jetpack Navigation이 뭔지 알고 설정되어 있다는 가정하에 하겠다.
아래 사진은 CreateQnaFragment와 categoryFragment를 Jetpack Navigation으로 연결한 navigationgraph 코드이다.



첫번째로 우리가 데이터를 받을 Fragment에 argument를 설정해줘야된다.
그러기 위해서는 위 사진의 categoryFragment의 argument코드를 넣어 주어야 된다.

<argument
    android:name="testData"
    app:argType="string"  // boolean타입일 경우 "boolean"라고 쓰면 됨 
    android:defaultValue="" />

여기서 코드를 해석 하자면 나는 testData 라는 key 값의 이름을 가진 데이터를 받을 것고 해당 데이터 타입이 string이며 default(기본값)값은 공백이라는 것이다.

이렇게 데이터 받을 categoryFragment에 해당 데이터 형식을 argument로 넣어 줬다면
이제 부터는 CreateQnaFragment와 categoryFragment에서 코드로 행동만 하면되면다.

일단 CreateQnaFragment에서 리스너를 아래 사진처럼 작성해준다.

 binding.clQuestion.setOnClickListener {
        val action = CreateQnaFragmentDirections.actionCreateQnaFragmentToCategoryFragment("String 값")
        findNavController().navigate(action)
}

그런 후 수신 받는 categoryFragment에서 아래 사진처럼
CategoryFragmentArgs와 받을 데이터의 key을 호출해주기만 하면 끝난다.^^

class CategoryFragment : BaseFragment<FragmentCategoryBinding>(R.layout.fragment_category) {

    // Navigation safe args 수신 args
    private val args: CategoryFragmentArgs by navArgs()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        initData()
    }

    // Navigation safe args 수신확인 코드
    private fun initData() {
        Toast.makeText(requireActivity(), args.testData, Toast.LENGTH_SHORT).show()
    }
}

이렇게 하면 Safe Args가 끝난다.
이제 우리는 편히 데이터를 전송할 수 있다.!!



알고 보면 참 쉬고 좋은 방법이다.
(근데 공식 문서로는 참 헷갈려 잘 되어 있지만..ㅎㅎ;)

'TIL > 스터디' 카테고리의 다른 글

ScrollView, DataBinding(하위 View 1개만)  (1) 2024.03.26
SavedStateHandle  (0) 2024.03.25
Constraintlayout Chain  (0) 2024.03.21
ViewBinding(실제 에러 사례)  (0) 2024.03.20
안드로이드 단일 아키텍처  (0) 2024.03.19
Share Link
reply
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30