AndroidのNavigationについて調べてみた。
きっかけ
特定の状況下で、画面が遷移するような実装をしていた。そのときに、以下のようなエラーになったので、それについて調べてみた。
navigation destination com.github.ymatoi.navigationsample:id/action_firstFragment_to_secondFragment is unknown to this NavController
状況と解決策
このような状況を navigation で定義している。
自動的に画面を遷移させるために、FirstFragmentのonViewCreatedに対して、以下のようなコードを書いている。 すると、起動時には問題なく、画面遷移をして、SecondFragmentに移動するが、戻るボタンを押すとクラッシュしてしまう
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) findNavController().navigate(R.id.action_firstFragment_to_secondFragment) }
これを解決するには、navigationの遷移部分を以下のようにしてあげればよい。こうすることで、戻るボタンを押しても、瞬時にsecondFragmentに遷移するようになる
findNavController().navigate(R.id.secondFragment)
調べ中
確証は持てていないが
FirstFragment の onViewCreated で、findNavController().currentDestination
の値を出力すると、戻るボタンを押したあとでは、SecondFragmentのidを出力するので、
R.id.action_firstFragment_to_secondFragment
が動くのはcurrentDestinationがFirstFragmentのidのときのみだと推測している。
R.id.secondFragment
のように直接Fragmentの指定をしてあげる場合は、currentDestinationに依存せずに、遷移できるようです。
上の説、あまり自身がないので、くわしいかたどなたかぁ。。
あと、そうすると、currentDestinationはいつ変わるのかって話題もきになってる。
追記
たとえば、SecondFragmentでfindNavController().popBackStack()
で戻ると、クラッシュしないみたいです。
そのときは、findNavController().currentDestination()
が期待値なので、BackButtonを押したときのみクラッシュするみたいですね。