web-dev-qa-db-ja.com

アクティビティの結果、このNavControllerに不明なナビゲーション先

ナビゲーションコントローラー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);

御時間ありがとうございます

8
Fabio

まあ、とんでもない解決策を見つけることができました...

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
3
Charles Madere

私は回避策を見つけましたが、明らかにそれを解決策と考えることはできません:

フラグメントインスタンスの状態が復元されると、そのようなフラグメントに関連付けられているnav_graphのアクションへのリンクがどういうわけか失われるかと思います...しかし、私は間違っている可能性があります

安全な引数またはそのIDのいずれかを介してアクション自体を指すのではなく、そのような場合は、ナビゲートするフラグメントのIDを直接使用できます。

この場合、引数を渡したい場合は、バンドル全体で昔ながらの方法で行う必要があります。

Bundle args = new Bundle();
args.putString(ID_ARG, arg);
Navigation.findNavController(getView()).navigate(R.id.fragmentId, args);
2
Fabio

私の場合は、以下のように正しくナビゲートする代わりに、fragmentManager?.popBackStack()を使用してナビゲートしていたためです。

Navigation.findNavController(activity!!, R.id.fragment_container).navigate(
                Navigation.findNavController(activity!!, R.id.fragment_container).graph.startDestination)
0
Marc Alexander