[android] Toolbar app:navigationIcon not working

이번 프로젝트에 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)
  }
}

일단 이렇게하니 잠깐동안 <- 아이콘이 나타나는 현상은 사라졌다.