AndroidのNavigationについて調べてみた。

きっかけ

特定の状況下で、画面が遷移するような実装をしていた。そのときに、以下のようなエラーになったので、それについて調べてみた。

navigation destination com.github.ymatoi.navigationsample:id/action_firstFragment_to_secondFragment is unknown to this NavController

状況と解決策

f:id:YMatoi:20190610222152p:plain

このような状況を 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を押したときのみクラッシュするみたいですね。