앞선 Navigation Component의 글의 보충 내용입니다.
https://jja2han.tistory.com/373
Navigation Component에 대하여..
1️⃣ Navigation을 통해서 Activity로 이동할 수 있을까?
정답은 가능하다.
나도 사용해 보기 전까지는 Activity에 대한 이동은 Intent를 이용했다.
Navigation을 배우기 전에 Activity로의 전환을 배웠고, 그때 Intent를 이용해서 구현했었다.
Navigation graph에 다음과 같이 정의를 하고 Activity로 이동을 하기 위해서 해당 액션을 navigate 하면 Activity로 이동할 수 있다.
2️⃣ Navigation을 통해서 Dialog로 이동할 수 있을까?
정답은 가능하다
단! DialogFragment여야 한다.
많은 이유가 있지만 공식문서에서도 생명주기 관리, 화면 회전과 같은 작업이 DialogFragment가 처리하기 쉽기때문에 권장한다.
따라서 이번 프로젝트로 Dialog 보단 DialogFragment로 정의해서 커스텀 다이얼로그를 구현했다.
Dialog.show()를 통해서 Dialog를 호출하는것은 알고 있었지만, DialogFragment로 정의해서 Navigation과 같이 쓸 수 있다는 사실은
프로젝트를 진행하면서 알게되었다.
다음과 같이 Navigation에서 정의할 수 있고, 액션을 통해서 이동할 수 있다.
또 하나의 장점은 DialogFragment도 프래그먼트이기 때문에 findNavController()의 사용이 가능하다는 점이다.
이 부분이 큰 강점으로 다가왔다.
만약 Dialog로 선언했다면 버튼에 대한 이벤트 처리를 호출한 Fragment나 Activity에서 받아와서 이동 처리를 해야 했지만,
DialogFragment로 정의를 하고 findNavController()를 사용해 Fragment, Activity로의 이동을 구현할 수 있었다.
3️⃣ 데이터 전달
Fragment의 경우에는 Safe Args를 이용해서 데이터를 전달할 수 있다.
기존의 Activity-> Activity로 이동하고, 데이터를 전달하기 위해선 Intent를 통해서 데이터를 전달했다.
하지만 Navigation을 통해서 Activity -> Activity로 이동이 가능한 것을 알았고, 데이터 전달도 Navigation에서 argument로 정의해서
주고받을 수 있다.
Fragment에서는 safe args를 다음과 같이 주고 받을 수 있다.
findNavController().navigate(AFragmentDirections.actionToBFragment(Data))
A Fragment에서 B Fragment로 action을 통해서 이동할 때 Data를 전달한다.
private val args: BFragmentArgs by navArgs()
B Fragment에서는 위와 같은 선언을 통해서 전달받은 argument를 사용할 수 있다.
전달할 Argument에 대해서는 기본적으로 Int, Float, Long, Boolean, String 등 여러 가지 값이 있다.
프로젝트를 진행하면서 선택된 데이터 클래스를 다음 프래그먼트에 넘겨줘야 했고, safe Args를 통해서 프래그먼트로 전달하고 싶었다.
data class를 전달하고 싶은 방법은 Parcelable과 Serializable 중 하나를 이용하면 되는데 나는 Serializable을 이용했다.
@Serializable
data class Space(
val id: String,
val name: String,
val imageUrl: String,
) : java.io.Serializable
다음과 같이 클래스 뒤에 java.io.Serializable을 추가하고, Custom Serializable을 선택한다.
그러면 다음과 같이 Argument로 Space를 선택할 수 있음을 확인할 수 있다.
4️⃣ Animation 기능
<action
android:id="@+id/action_A_to_B
app:destination="@id/BActivity"
app:enterAnim="@anim/anim1"
app:exitAnim="@anim/anim2" />
Navigation Component를 이용하면 다음과 같이 애니메이션도 전환 간에 적용할 수 있다.
애니메이션을 깊게 다뤄보지 못했지만, 있는 것과 없는 것은 사용자 측면에서 의미 있는 차이를 준다고 생각한다.
아직까지 프로젝트에서 적용해보지 못했지만 추후의 애니메이션도 Navigation에 적용할 예정이다.
'Skils > Android' 카테고리의 다른 글
[Android] - RecyclerView 체크박스 유지하기 (0) | 2023.12.10 |
---|---|
[Android] - CustomView DrawText (0) | 2023.12.10 |
[Android] Github action을 이용한 CD(Firebase App Distribution) (3) | 2023.11.27 |
[Android] Github action을 이용한 CI(ktlint) (1) | 2023.11.27 |
[Android] - Jetpack Compose (1) | 2023.10.31 |