여태까지 진행했던 프로젝트에서 꼭 빠짐없이 Navigation을 도입하였다.
왜냐하면 프래그먼트간의 이동을 쉽게할 수 있고, 데이터전달을 기존의 방식보다 안전하게 할 수 있기 때문이다.
전에 트러버 프로젝트에서 Bottom Navigation과 Jetpack Navigation을 연결하면서 쓴 글이 있다.
기존에 썼던 글이 있지만, 이번에 한번 더 정리하면서 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이 된다. 바로 이 문제를 방지하는 것이다.
네비게이션 파일에 들어가 데이터를 받는 프래그먼트에서 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을 꼭 도입하고 있다.
'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 |