프로그래밍 공부/Android

[kotlin] Android jetpack Navigation

뚜벅이! 2021. 5. 14. 14:43
728x90

프로젝트에는 딱히 필요없는 부분이었지만 , 써보고 싶어서 써보는 Navigation 기능.

Fragment나 Activity 관계없이 일관된 API 를 제공하는것이 매력적으로 보였다.

(기존 중첩 Fragment에 있던 Animation 버그를 효과적으로 컨트롤하는 것으로도 꽤 좋은 성능을 보여준다)

 

 

https://developer.android.com/jetpack/androidx/releases/navigation

 

Navigation  |  Android 개발자  |  Android Developers

Navigation Navigation은 Android 애플리케이션 내에서 '대상' 사이를 탐색하는 프레임워크로, 대상이 Fragment, Activity 또는 기타 구성요소로 구현되었는지에 관계없이 일관된 API를 제공합니다. 이 표에는

developer.android.com

 

 

별다른 기능없이 카메라(CameraX 이것도 처음써본다.)를 켤때, 권한받는 간단한 예제를 구현해보려고 한다.

우선 종속 추가해주고,

dependencies {

    def camerax_version = "1.0.0-beta08"
    
    //camera
    implementation "androidx.camera:camera-core:${camerax_version}"
    implementation "androidx.camera:camera-camera2:${camerax_version}"
    implementation "androidx.camera:camera-lifecycle:${camerax_version}"
    implementation "androidx.camera:camera-view:1.0.0-alpha15"

    def nav_version = "2.3.0"
    implementation "androidx.navigation:navigation-runtime-ktx:$nav_version"
    implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
    implementation "androidx.navigation:navigation-ui-ktx:$nav_version"
}

 

혼합모듈 추가

apply plugin: "androidx.navigation.safeargs"

 

 

 

gradle.properties에 android.useAndroidX=true 구문을 추가해준다.

# AndroidX package structure to make it clearer which packages are bundled with the
# Android operating system, and which are packaged with your app's APK
# https://developer.android.com/topic/libraries/support-library/androidx-rn
android.useAndroidX=true

 

 

이제 nav를 정의해보자 nav_gragh.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"
    android:id="@+id/nav_graph"
    app:startDestination="@id/permissions_fragment">

    <fragment
        android:id="@+id/permissions_fragment"
        android:name="com.nav.test.fragment.PermissionsFragment"
        android:label="PermissionsFragment" >

        <action
            android:id="@+id/action_permissions_to_camera"
            app:destination="@id/camera_fragment"
            app:popUpTo="@id/permissions_fragment"
            app:popUpToInclusive="true" />

    </fragment>

    <fragment
        android:id="@+id/camera_fragment"
        android:name="com.nav.test.fragment.CameraFragment"
        android:label="CameraFragment" >

        <action
            android:id="@+id/action_camera_to_permissions"
            app:destination="@id/permissions_fragment"
            app:popUpTo="@id/camera_fragment"
            app:popUpToInclusive="true"/>

    </fragment>

</navigation>

어메이징.. UI로 표기되어 알기쉽게 구성되어있다.

 

StartDestination 으로 시작하는곳을 정해주고, action으로 어디가 목적지인지 정해준다.

popUpTo 는 특정 위치로 돌아가게끔, popUpToInClusive로 추가목적지를 팝 할수있다. 와우..

 

 

Fragment 내용까지 포함하면 내용이 너무 길어지므로 fragment 코드는 생략

 

 

적용한 프로젝트는

권한체크 -> 카메라 -> 갤러리 -> 사진편집 기능으로 이어지게끔 작성해 두었고,

nav는 써본것으로 만족해서 카메라까지만 연동해두었다.

 

 

이동하려면 이런식으로 이동할 수 있다.

Navigation.findNavController(requireActivity(), R.id.fragment_container).navigate(
PermissionsFragmentDirections.actionPermissionsToCamera())

데이터 전송도 

findNavController().navigate( ... ).putObject(여기)

받는 방법도

argument?.getObject()

 

결국, bundle을 사용하는 방법이라 친숙해서 금방 적응할 수 있다.

728x90