프로젝트에는 딱히 필요없는 부분이었지만 , 써보고 싶어서 써보는 Navigation 기능.
Fragment나 Activity 관계없이 일관된 API 를 제공하는것이 매력적으로 보였다.
(기존 중첩 Fragment에 있던 Animation 버그를 효과적으로 컨트롤하는 것으로도 꽤 좋은 성능을 보여준다)
https://developer.android.com/jetpack/androidx/releases/navigation
별다른 기능없이 카메라(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을 사용하는 방법이라 친숙해서 금방 적응할 수 있다.
'프로그래밍 공부 > Android' 카테고리의 다른 글
[android] context 란 (0) | 2022.12.21 |
---|---|
[android-kotlin] firebase notification / message (0) | 2022.07.14 |
[android] migration 진행중 ... kotlin v, IDE v, library v...etc... (0) | 2022.03.29 |
[kotlin] LiveData & DataBinding (0) | 2021.07.20 |
[Android&Kotlin] gps tracking (3) | 2021.02.04 |