从另一个图表导航到一个片段而不是它的开始目的地

Ahm*_*adi 15 navigation android kotlin android-jetpack

在我的第一张图中,我有以下内容:

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/firstGraph"
    app:startDestination="@id/listFragment">

    <fragment
        android:id="@+id/listFragment"
        android:name="com.example.ListFragment">

        <action
            android:id="@+id/action_list_to_details"
            app:destination="@id/detailsFragment" />

    </fragment>

    <fragment
        android:id="@+id/detailsFragment"
        android:name="com.example.DetailsFragment">

    </fragment>
</navigation>
Run Code Online (Sandbox Code Playgroud)

在我的第二张图中,我有以下内容:

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/secondGraph"
    app:startDestination="@id/dashboardFragment">

    <include app:graph="@navigation/firstGraph" />

    <fragment
        android:id="@+id/dashboardFragment"
        android:name="com.example.DashboardFragment">
        <action
            android:id="@+id/action_dashboard_to_notification"
            app:destination="@id/notificationFragment"/>
    </fragment>

    <fragment
        android:id="@+id/notificationFragment"
        android:name="com.example.NotificationsFragment">

        <action
            android:id="@+id/action_notification_to_details"
            app:destination="@id/firstGraph"/>

    </fragment>
</navigation>
Run Code Online (Sandbox Code Playgroud)

我想直接从“notificationFragment”导航到“detailsFragment”而不是起始目的地,包括第二个图形堆栈

ian*_*ake 25

根据嵌套图文档

[嵌套图] 还提供了一定程度的封装——嵌套图之外的目的地无法直接访问嵌套图中的任何目的地。

有一个例外,当您使用 URI 导航时,有效地深度链接到任何目的地:

与使用操作或目标 ID 的导航不同,您可以导航到图中的任何 URI,无论目标是否可见。您可以导航到当前图表上的目的地或完全不同的图表上的目的地。

因此,您可以向图表添加隐式深层链接

<fragment
    android:id="@+id/detailsFragment"
    android:name="com.example.DetailsFragment">
    <deepLink app:uri="android-app://your.package.name/details" />
</fragment>
Run Code Online (Sandbox Code Playgroud)

然后通过 URI 导航到该目的地:

val uri = Uri.parse("android-app://your.package.name/details")
navController.navigate(uri)
Run Code Online (Sandbox Code Playgroud)

你的 URI 是什么并不重要,只要<deepLink>你传递的 和navigate匹配。您拥有的任何参数都需要在 URL 中进行编码。

  • 这看起来很有希望,但我想说,当参数是一个对象时,它会变得很奇怪 - 因为那样我就必须破坏对象属性并在 URL 中一一传递。 (3认同)
  • @FirstOne - 考虑到参数会影响您可以放入保存的实例状态的有限数据量(或面临“TransactionTooLargeException”,特别是因为较新版本的 Android 更低的限制),传递标识符是一种更好的方法在所有情况下都做事情,而不仅仅是这一特定情况。 (3认同)
  • @FirstOne - 想想你是否正在建立一个网站。您是否会直接在 URL 中对信息进行编码,还是拥有一个通用的信息存储库并且仅在 URL 中传递标识符?这里有同样的问题(同样的建议:只需传递一个标识符) (2认同)