이번 프로젝트에 androidx 를 도입하면서 Navigation 도 같이 도입했다. 매우매우 편하다. 이젠 iOS의 스토리보드가 전혀 부럽지 않다.
다만 두 가지 문제가 있는데, 하나는 back 키 제어인데, 이건 http://pluu.github.io/blog/android/2019/02/03/androidx-backkey/ 이거로 하면 된다. 현재는 이렇게 사용하고 있다.
open class BaseNavigationFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) activity?.addOnBackPressedCallback(object : OnBackPressedCallback { override fun handleOnBackPressed(): Boolean { navigateUp() return true } }) } /** * 이전 화면으로 이동. 마지막 화면이라면 앱 종료 */ protected fun navigateUp() { if (fragmentManager?.backStackEntryCount == 0) { activity?.finish() } else { findNavController().navigateUp() } } }
그 다음 문제는 Toolbar의 app:navigationIcon 설정이 먹히지 않는다는 거다. 기본 아이콘인 <- 이 모양으로 나오는데, fragment.onViewCreated() 에서 아이콘을 바꿔주면 < 로 바꿔주면, <-가 아주 잠깐 나왔다가 < 로 바뀌게 된다. 좋은 방법이 없나싶어서 찾아보다가 https://stackoverflow.com/a/54021760/1025379 에서 힌트를 얻었다.
메인 화면에서는 로고만 표시되고, 나머지 화면에서는 < 제목 형태로 표시된다.
// MainActivity override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) navController.addOnDestinationChangedListener(destinationChangedListener) } override fun onDestroy() { super.onDestroy() navController.removeOnDestinationChangedListener(destinationChangedListener) } private val destinationChangedListener = NavController.OnDestinationChangedListener { _, destination, _ -> if (destination.id == R.id.mainFragment) { supportActionBar?.setDisplayHomeAsUpEnabled(false) supportActionBar?.setLogo(R.drawable.actionbar_mate_logo) supportActionBar?.title = null } else { supportActionBar?.setDisplayHomeAsUpEnabled(true) supportActionBar?.setLogo(null) supportActionBar?.setHomeAsUpIndicator(R.drawable.ic_actionbar_back) } }
일단 이렇게하니 잠깐동안 <- 아이콘이 나타나는 현상은 사라졌다.