개발일지

Android in A..Z - Navigation (Safe Args) 본문

Android (안드로이드)/Navigation

Android in A..Z - Navigation (Safe Args)

강태종 2021. 4. 6. 06:13

Safe Args

Navigation에서 데이터를 전달하는 Bundle 방식은 key-value 구조로 key값에 string을 입력하는 과정이나 value를 캐스팅하는 과정에서 개발자가 실수할 가능성이 있지만 Safe Args는 유형 안전성을 보장하므로 데이터를 탐색하고 전달할 때는 Safe Args를 사용하는 것이 좋습니다.


Dependency

 

build.gradle (Project)

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

 

build.gradle (Module)

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

지원되는 인수목록

유형 Type 기본값 지원 여부 null 지원 여부
정수 app:argType="integer" 아니요
Float app:argType="float" 아니요
Long app:argType="long" 예 - 기본값은 항상 'L' 접미사로 끝나야 합니다(예: '123L'). 아니요
부울 app:argType="boolean" 예 - 'true' 또는 'false' 아니요
문자열 app:argType="string"
리소스 참조 app:argType="reference" 예 - 기본값은 '@resourceType/resourceName'(예: '@style/myCustomStyle') 형식이나 '0'이어야 합니다. 아니요
사용자설정 Parcelable app:argType="<type>", 여기서 <type>은 Parcelable의 정규화된 클래스 이름입니다. 기본값 '@null'을 지원합니다. 다른 기본값은 지원하지 않습니다.
사용자설정 Serializable app:argType="<type>", 여기서 <type>은 Serializable의 정규화된 클래스 이름입니다. 기본값 '@null'을 지원합니다. 다른 기본값은 지원하지 않습니다.
사용자설정 Enum app:argType="<type>", 여기서 <type>은 enum의 정규화된 이름입니다. 예 - 기본값은 정규화되지 않은 이름과 일치해야 합니다(예: 'SUCCESS'가 MyEnum.SUCCESS와 일치). 아니요

예제소스

class InputFragment : BaseFragment(), DataBinding<FragmentInputBinding> {
    override val binding: FragmentInputBinding by lazy { DataBinding.get(this, R.layout.fragment_input) }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
        super.onCreateView(inflater, container, savedInstanceState)
        onCreateViewDataBinding()
        onCreateOnAction()
        return binding.root
    }

    private fun onCreateViewDataBinding() {
        binding.lifecycleOwner = this
    }

    private fun onCreateOnAction() {
        binding.setOnAction {
            val args = binding.editText.editText!!.text.toString()
            findNavController().navigate(InputFragmentDirections.actionInputFragmentToOutputFragment(args))
        }
    }
}
class OutputFragment : BaseFragment(), DataBinding<FragmentOutBinding> {
    override val binding: FragmentOutBinding by lazy { DataBinding.get(this, R.layout.fragment_out) }

    private val args by navArgs<OutputFragmentArgs>()

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

        return binding.root
    }

    private fun onCreateViewDataBinding() {
        binding.lifecycleOwner = this
    }

    private fun onCreateArgs() {
        binding.args = args.args
    }
}
    <fragment
        android:id="@+id/inputFragment"
        android:name="com.taetae98.navigation.fragment.InputFragment"
        android:label="Input"
        tools:layout="@layout/fragment_input">
        <action
            android:id="@+id/action_inputFragment_to_outputFragment"
            app:destination="@id/outputFragment" />
    </fragment>
    <fragment
        android:id="@+id/outputFragment"
        android:name="com.taetae98.navigation.fragment.OutputFragment"
        android:label="@string/safe_args"
        tools:layout="@layout/fragment_out">
        <argument
            android:name="args"
            app:argType="string"
            app:nullable="true"
            android:defaultValue="@null" />
    </fragment>

NavGraph에서 인수 목록을 정의하고 rebuild를 진행하면 Safe Args로 보낼 수 있는 Direction이 생성된다.

Safe Args를 받을 때 by navArgs를 사용해서 NavArgs를 획득하고 인수에 접근할 수 있다.


Git (예제소스)

github.com/KangTaeJong98/Example/tree/main/Android/Navigation

 

KangTaeJong98/Example

My Example Code. Contribute to KangTaeJong98/Example development by creating an account on GitHub.

github.com

 

Comments