어제 화면전환을 위해 BackStack
과 BackStack Entry
에 대해 알아보았다.
이제 전환되기 이전의 화면을 prevBackStackEntry
의 Destination
을 활용해 알아볼 수 있게 되었다.
하지만 문제가 생겼는데, prevBackStackEntry
의 경우 popback
메서드를 사용해 복귀할 경우 BackStack
에 있던 Entry
가 삭제되기 때문에 현재 BackStack
에 있는 이전 Entry
를 불러왔다.
(popBack
으로 돌아온 이전 Fragment
의 Entry
가 없음)
따라서 popBack
메서드를 사용해 화면을 전환해 돌아올 경우 이전의 화면이 어떤 화면이었는지 알기위해 다른 방법을 사용해야했다.
이러한 문제를 이미 겪었기때문인지 BackStack
에는 또 다른 방법으로 이전 Fragment
의 정보를 저장하는 방법이 있다.
바로 State Handle
을 저장하는 방법인데, popBack
메서드를 실행하기전 현재 상태를 핸들에 저장해서 확하는 방법이다.
popBack
으로 화면을 전환하기 전에 getBackStackEntry
메서드를 사용해 이동하려는 대상의 Entry
를 불러온다.
그 후 해당 Entry
에 savedStateHandle
를 사용해 Key - Value
로 현재 Fragment
의 정보를 담아준다.
val nav = navHost.navController.
// saveStatHandle에 "prev_frag"를 키값으로 현재 프래그먼트 ID를 추가해준다
nav.getBackStackEntry(R.id.menu_search).savedStateHandle.set("prev_frag", R.id.menu_my_storage)
nav.popBackStack()
이제 해당 프래그먼트의 Entry
의 stateHandle
에는 "prev_frag"
라는 키값으로 현재 Fragment
의 ID
가 들어있기 때문에 현재 Fragment
의 Entry
를 불러온뒤 stateHandle
에 있는 "prev_frag"
의 value
를 확인하면 이전 프래그먼트를 알아낼 수 있다.
val prevId = findNavController().currentBackStackEntry?.savedStateHandle?.get<Int>("prev_frag")
if (prevId == null) {
binding.etSearchBar.requestFocusAndKeyboardShow()
}
이후 해당 ID
값을 원하는 Fragment
의 ID
값과 비교해서 원하는 행동을 하면 된다.
그래도 자잘하게 원하는 것들을 만들어 보았다.
생각보다 잘돼서 기분이 좋다.