[안드로이드] Navagation Safe Args를 사용해 데이터 전달 Fragment간 데이터전달

2021. 2. 1. 23:43개발/[Kotlin] 안드로이드 개발

반응형

안녕하세요 ! 전에 네비게이션을 사용해 네비게이션 드로어를 구현했었는데요. 

Fragment를 사용해 데이터를 주고 받을 때 예전에는 복잡한 방법으로 데이터를 주고 받았었는데요.

또 프래그먼트간 이동도 코드 한 줄로 쉽게 이동할 수 있습니다.

예제를 보겠습니다. Navigation Drawer 구현 방법은 yang-droid.tistory.com/15?category=938455를 참고해주세요

1. project수준의 build.gradle

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

2. 앱 수준의 build.gradle

// Java
apply plugin: "androidx.navigation.safeargs"
// Kotlin
apply plugin: "androidx.navigation.safeargs.kotlin"

후 Build - Rebuild해주세요~

1. Fragment간 이동

1. Action으로 연결 된 경우

MainFragment 버튼 클릭시 ThirdFragment로 이동 하는 방법

// 버튼을 클릭하면 프래그먼트 변경
view.findViewById<Button>(R.id.btnGo).setOnClickListener {
// 자신의 Fragment이름 + Directions             화살표로 연결해준 action~~
          var action =  MainFragmentDirections.actionMainToThirdFragment()
            findNavController().navigate(action)
        }

2. Action으로 연결 되어 있지 않은 경우

GlobalAction으로 지정할 Fragment를 클릭 후 오른쪽 클릭 Add Action을 Global로 처리하면 !!

<action android:id="@+id/action_global_thirdFragment" app:destination="@id/thirdFragment"/>

다음과 같이 코드가 추가됩니다.

그 후에 아래 코드로 이동하시면 됩니다.

var action = YourDirections.actionGlobalToThirdFragment()
findNavController().navigate(action)
        

 

 

2. 데이터 전달

데이터 전달은 Safe Args를 사용합니다. 

MainFragment에서 ThirdFragment에서 데이터를 전달해 Toast메시지를 띄우도록 해보겠습니다.

 

navigation으로 돌아와서 Arguments + 클릭 

Name : 변수이름

Type : 자료형 Type (데이터 클라스인경우 Custom Serializable )

Array: 배열인지?

Nullable : Null값일 수 있는지? (예외처리 필요)

Default Value : 만약 값을 못받으면 Default 값은?

지정해주고 ReBuild (xml에서 데이터 작업을 해주면 ReBuild 해주어야 합니다.)

var action = MainFragmentDirections.actionMainToThirdFragment("빠끄")

findNavController().navigate(action)

로 이동을 한 후에 ThidFragment에서는

val args: ThirdFragmentArgs by navArgs() //Args 만든 후
var tMsg = args.msg // 아까 만든 msg 를 tMsg에 대입
Toast.makeText(context, tMsg,Toast.LENGTH_LONG).show()

결과물 !! 두둥 SafeArgs로 쉽고 빠르게 데이터를 주고 받을 수 있습니다 !

만약 VO와 같은 data class를 이동하고 싶다면 직렬화를 통해 가능하게 할 수 있습니다.

data class가 Parcelize이나 Serializable를 상속하게 하고 클릭!

를 클릭하시면 됩니다.

소스코드 전문

MainFragment

더보기

class MainFragment : Fragment() {

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
var view = inflater.inflate(R.layout.fragment_main, container, false)
view.findViewById<Button>(R.id.btnGo).setOnClickListener {
var action = MainFragmentDirections.actionMainToThirdFragment("빠끄")
findNavController().navigate(action)
}
return view
}
}

ThirdFragment

더보기

class ThirdFragment : Fragment() {
val args: ThirdFragmentArgs by navArgs()
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
var view = inflater.inflate(R.layout.fragment_third, container, false)

var tMsg = args.msg
Toast.makeText(context, tMsg,Toast.LENGTH_LONG).show()
return view
}

}

navigation.xml

더보기

<?xml version="1.0" encoding="utf-8"?>
<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/navigation"
app:startDestination="@id/main">

<fragment
android:id="@+id/main"
android:name="com.cookandroid.navdrawer.MainFragment"
android:label="메인화면"
tools:layout="@layout/fragment_main">
<action
android:id="@+id/action_blankFragment_to_secondFragment"
app:destination="@id/second" />
<action
android:id="@+id/action_main_to_thirdFragment"
app:destination="@id/thirdFragment" />
</fragment>
<fragment
android:id="@+id/second"
android:name="com.cookandroid.navdrawer.SecondFragment"
android:label="두번재 화면"
tools:layout="@layout/fragment_second" />
<fragment
android:id="@+id/thirdFragment"
android:name="com.cookandroid.navdrawer.ThirdFragment"
android:label="ThirdFragment" >
<argument
android:name="msg"
app:argType="string"
android:defaultValue='""' />
</fragment>
<action android:id="@+id/action_global_thirdFragment" app:destination="@id/thirdFragment" />
</navigation>

반응형