쏭식
Ssongcode;
쏭식
전체 방문자
오늘
어제
  • 분류 전체보기 (106)
    • JAVA (21)
      • Basic (21)
    • Kotlin (14)
      • Basic (14)
    • Android (64)
      • Basic (24)
      • JETPACK (30)
      • Compose (8)
      • 파고들기 (2)
    • Project (4)
    • etc (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 배열
  • 컴포즈
  • livedata
  • ViewModel
  • Room
  • DataBinding
  • 알고리즘
  • mvvm
  • 메소드
  • 백준
  • Kotlin
  • Adapter
  • 기초100제
  • 변수
  • 상속
  • compose
  • 코틀린
  • 코드업100제
  • 프로젝트회고
  • Jetpack
  • 코틀린코테
  • Android
  • 코테
  • workmanager
  • AAC
  • 자료구조
  • 자바
  • 객체지향
  • 코딩테스트
  • 리사이클러뷰

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
쏭식

Ssongcode;

[JETPACK개론] Navigation
Android/JETPACK

[JETPACK개론] Navigation

2022. 9. 18. 23:59

여태까지 진행했던 프로젝트에서 꼭 빠짐없이 Navigation을 도입하였다.

왜냐하면 프래그먼트간의 이동을 쉽게할 수 있고, 데이터전달을 기존의 방식보다 안전하게 할 수 있기 때문이다.

 

전에 트러버 프로젝트에서 Bottom Navigation과 Jetpack Navigation을 연결하면서 쓴 글이 있다.

 

[Android] JetPack Navigation으로 Bottom Navigation 설정하기

안드로이드를 공부하면서 간단한 화면 전환은 intent로 구현했었다. 하지만 레이아웃이 복잡해질수록 코드가 길어지며 가독성이 떨어지는 문제점을 확인할 수 있었다. 이 경우를 해결하기 위해 J

ssongcode.tistory.com

기존에 썼던 글이 있지만, 이번에 한번 더 정리하면서 Navigation을 왜 이용해야하는지,

또 기존에 정리했던 기능 이외에도 어떤 기능을 사용할 수 있는지 정리해보겠다.

 

먼저 gradle파일에 다음을 추가하자!

implementation 'androidx.navigation:navigation-fragment-ktx:2.4.1'
implementation 'androidx.navigation:navigation-ui-ktx:2.4.1'

위의 게시물에서 정리했던 그대로, navigation파일을 만든 후 예시 프래그먼트를 5개 만들어보자.

[프래그먼트간의 이동]

네비게이션 파일에서 각각의 프래그먼트를 추가 후, 위의 그림에서 하늘색 지점을 드래그하여 이동하고 싶은 프래그먼트로 설정한다.

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

그리고 프래그먼트1에서 버튼을 클릭했을 때 2로 이동하는 코드를 작성해보면 위와 같다.

옆에 있는 bundle은 일단 무시하자.

그럼 이제 1 -> 2-> 3-> 4-> 5 이렇게 갔다가 5에서 backButton을 클릭했을 때 1로 돌아가려면 어떻게 해야할까?

 

[Back Button Event]

위와 같은 방식으로라면 네비게이션 파일로 가서 위의 그림처럼 5에서 1로 드래그를 해주어 설정하면 좋겠지만 간단하게 할 수 있는 방법이 존재한다.

4 -> 5 로 가는 화살표를 클릭한 다음 아래와 같이 Pop Behavior에서 popUpTo에서 가고 싶은 프래그먼트를 설정하면 끝!

그럼 프래그먼트5에서 뒤로가기 버튼을 클릭했을 때 설정한 프래그먼트로 가는 것을 확인할 수 있다.

 

[Safe Args]

나는 사실 네비게이션을 사용했던 제일 중요한 이유가 이 때문이였다. 바로 Safe Args이다.

말 그대로 인자값들을 안전하게 전달할 수 있다는 기능이다. 

그럼 안전하다는 것은 무엇일까?

코틀린에서는 ? 타입을 적어주어 NPE에러를 방지하고 있다. 

val bundle = Bundle()
        bundle.putString("key", "value") //null값이 전달될 수 있음

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

        val action = BlankFragment1Directions.actionBlankFragment1ToBlankFragment2("abcde")
        //데이터를 안넘기고 화면전환이 이루어지면 디폴트값이 들어감, null을 방지할 수 있음

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

Safe Args를 사용하지 않고 bundle을 사용하여 다음 프래그먼트에 데이터를 던진다고 가정해보자.

만일 값이 전달되지 않았을 경우에는 다음 프래그먼트에서 받는 데이터는 null이 된다. 바로 이 문제를 방지하는 것이다.

Safe Args

네비게이션 파일에 들어가 데이터를 받는 프래그먼트에서 Arguments를 클릭하여 디폴트값을 설정할 수있다.

val action = BlankFragment1Directions.actionBlankFragment1ToBlankFragment2("abcde")

그럼 이렇게 프래그먼트1에서 코드를 작성할 수 있으며, 데이터가 없이 전달되어도 위에서 설정한 디폴트값을 받게된다.

이렇게해서 null값을 방지하여 안전하게 데이터를 전달할 수 있다.

 

[Animations]

프래그먼트간의 이동을 할 때 단순히 뷰가 사라지고 다른 뷰가 생기는 느낌을 받을 때 애니메이션 기능을 사용할 수 있다.

애니메이션을 주고 싶은 해당 화살표를 클릭하여 오른쪽 상단 속성에서 애니메이션을 추가할 수 있다.

애니메이션

그럼 enterAnim, exitAnim, popEnterAnim, popExitAnim은 무엇일까?

1. enterAnim 은 A -> B 로 갈 때 B가 보이는 방식

2. exitAnim 은 A -> B 로 갈 때 A가 사라지는 방식

3. popEnterAnim 은 뒤로가기 B -> A로 올 때 A가 나타나는 방식

4. popExitAnim 은 뒤로가기 B -> A로 올 때 B가 사라지는 방식 을 의미한다.

 

앱의 특성을 잘 이용하여 적절한 애니메이션을 사용한다면 앱의 생동감을 줄 수 있다!!

이러한 많은 장점들이 있어 Navigaion을 꼭 도입하고 있다.

 

GitHub - SsongSik/Jetpack_Android_Practice: Android practice using the Jetpack library

Android practice using the Jetpack library. Contribute to SsongSik/Jetpack_Android_Practice development by creating an account on GitHub.

github.com

 

저작자표시 (새창열림)

'Android > JETPACK' 카테고리의 다른 글

[JETPACK개론] Paging  (0) 2022.09.26
[JETPACK개론] DataStore  (0) 2022.09.25
[JETPACK개론] WorkManager(5) + 주기적작업, 고유작업  (0) 2022.09.17
[JETPACK개론] WorkManager(4) + 작업진행률 관찰  (0) 2022.09.14
[JETPACK개론] WorkManager(3) + Chaining, Coroutine  (0) 2022.09.09
    'Android/JETPACK' 카테고리의 다른 글
    • [JETPACK개론] Paging
    • [JETPACK개론] DataStore
    • [JETPACK개론] WorkManager(5) + 주기적작업, 고유작업
    • [JETPACK개론] WorkManager(4) + 작업진행률 관찰
    쏭식
    쏭식

    티스토리툴바