안드로이드 네비게이션 Safe Args를 활용한 프래그먼트 간 데이터 전달

최대환·2024년 1월 3일
0

Safe Args를 사용하면 프래그먼트 간에 데이터를 안전하게 전달할 수 있습니다. 데이터를 전달하지 않았을 때 기본값을 설정하는 것도 가능합니다. 또한, Safe Args는 데이터의 타입 안전성을 보장해주기 때문에 런타임 에러를 방지하는 데 도움이 됩니다.

종속성 추가

프로젝트 수준의 build.gradle 파일과 앱 수준의 build.gradle 파일에 각각 필요한 종속성을 추가합니다.
프로젝트 수준 build.gradle에는 다음과 같이 추가합니다.

buildscript {
    repositories {
        google()
    }
    dependencies {
        classpath("androidx.navigation:navigation-safe-args-gradle-plugin:2.4.1")
    }
}

plugins {
    id 'com.android.application' version '7.1.0' apply false
    id 'com.android.library' version '7.1.0' apply false
    id 'org.jetbrains.kotlin.android' version '1.5.30' apply false
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

그리고 앱 수준 build.gradle에는 이렇게 추가합니다.

id 'androidx.navigation.safeargs.kotlin'

네비게이션에서 Argument 추가

네비게이션 그래프에서 데이터를 전달하고자 하는 대상 프래그먼트에 Argument를 추가합니다.

데이터 전달

데이터를 전달하는 프래그먼트에서 아래와 같이 코드를 작성합니다.
여기서 BlankFragment1Directions는 Safe Args가 생성한 클래스입니다.

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        val view = inflater.inflate(R.layout.fragment_blank1, container, false)

        val action = BlankFragment1Directions.actionBlankFragment1ToBlankFragment2("abcdef")

        view.findViewById<Button>(R.id.btn1).setOnClickListener {
            Navigation.findNavController(view).navigate(action)
        }

        return view
    }

데이터를 받는 프래그먼트에서는 아래와 같이 코드를 작성합니다. by navArgs()를 이용하여 이 Argument를 가져옵니다.

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val view = inflater.inflate(R.layout.fragment_blank2, container, false)

        view.findViewById<Button>(R.id.btn2).setOnClickListener {
            Navigation.findNavController(view).navigate(R.id.action_blankFragment2_to_blankFragment1)
        }

        val args : BlankFragment2Args by navArgs()
        Log.d("BlankFragment2", args.key)

        return view
    }
profile
나의 개발지식 output 공간

0개의 댓글