ナビゲーションコントローラー1.0.0alpha05を使用していますが、うまく機能していますが、アクティビティの結果の後にナビゲーションアクションを実行すると、この恐ろしいエラーが発生します。
私は単一のアクティビティ/複数のフラグメント構造を持っています。特に、アイテムのリストを含むフラグメントと、新しいものを追加するためのフォームを備えたフラグメントがあります。
画像のない別の写真を追加すると機能し、アイテムのリストが表示された前の写真に戻りますが、写真を撮るとナビゲーション中に例外が発生します。
原因:Java.lang.IllegalArgumentException:ナビゲーション先XXがこのNavControllerに認識されていません
アクションを含むフォームフラグメントのナビゲーショングラフ:
<fragment
Android:id="@+id/idFormFragment"
Android:name="FormFragment"
Android:label="FormFragment"
tools:layout="@layout/form_fragment">
<argument
Android:name="idClient"
Android:defaultValue="-1"
app:argType="integer" />
<argument
Android:name="idServer"
app:argType="string" />
<action
Android:id="@+id/actionFormToList"
app:destination="@id/idListFragment" />
</fragment>
安全な引数を持つアクション呼び出しのコード
FormFragmentDirections.ActionFormToList action = new FormFragmentDirections.ActionFormToList(sample.getIdJob());
Navigation.findNavController(getView()).navigate(action);
御時間ありがとうございます
まあ、とんでもない解決策を見つけることができました...
NavHostFragment
から拡張されるホストナビゲーションフラグメントを使用していると仮定して、次の(Kotlin)コードを追加します。
/*
* begin DUMB Navigation Component hack
*
* This fixes an IllegalArgumentException that can sometimes be thrown from within the
* Navigation Architecture Component when you try to navigate after the Fragment has had its
* state restored. It occurs because the navController's currentDestination field is null,
* which stores where we currently are in the navigation graph. Because it's null, the
* Navigation Component can't figure out our current position in relation to where we're
* trying to navigate to, causing the exception to be thrown.
*
* This fix gives the navController a little Nudge by gently setting it to where we currently
* are in the navigation graph.
*
* This fix is verified as both working AND necessary as of Navigation Components version
* 1.0.0-alpha07.
*
* There's a tiny bit more information at this thread, but it's pretty limited:
* https://stackoverflow.com/questions/52101617/navigation-destination-unknown-to-this-navcontroller-after-an-activity-result
*/
private var checkCurrentDestination = false
override fun onStart() {
super.onStart()
if (checkCurrentDestination && navController.currentDestination == null) {
navController.navigate(navController.graph.startDestination)
}
checkCurrentDestination = false
}
override fun onStop() {
super.onStop()
checkCurrentDestination = true
}
/*
* end DUMB Navigation Component hack
*/
SEOの取り組みでは、スタックトレースは次のようになります。
Caused by: Java.lang.IllegalArgumentException: navigation destination XX is unknown to this NavController
私は回避策を見つけましたが、明らかにそれを解決策と考えることはできません:
フラグメントインスタンスの状態が復元されると、そのようなフラグメントに関連付けられているnav_graphのアクションへのリンクがどういうわけか失われるかと思います...しかし、私は間違っている可能性があります
安全な引数またはそのIDのいずれかを介してアクション自体を指すのではなく、そのような場合は、ナビゲートするフラグメントのIDを直接使用できます。
この場合、引数を渡したい場合は、バンドル全体で昔ながらの方法で行う必要があります。
Bundle args = new Bundle();
args.putString(ID_ARG, arg);
Navigation.findNavController(getView()).navigate(R.id.fragmentId, args);
私の場合は、以下のように正しくナビゲートする代わりに、fragmentManager?.popBackStack()
を使用してナビゲートしていたためです。
Navigation.findNavController(activity!!, R.id.fragment_container).navigate(
Navigation.findNavController(activity!!, R.id.fragment_container).graph.startDestination)