Android NavController: как открыть один и тот же фрагмент одним и тем же действием - PullRequest
1 голос
/ 23 октября 2019

У меня есть фрагмент Category и SubCategoryFragment для ввода дочерних категорий для просмотра. У меня есть действия в графе навигации XML, чтобы открыть SubCategoryFragment. Если я открываю какую-либо корневую категорию и щелкаю по любому ее дочернему элементу, то если по щелчку дочернего каталога есть дочерние элементы, тогда я должен открыть SubCategoryFragment, когда пользователь щелкнет по нему дочерним. Существуют схемы типа дерева:

Фрагмент корневой категории:

enter image description here

Фрагмент дочерней категории:

enter image description here

Следующий фрагмент дочерней категории:

enter image description here

Когда я щелкаю последний вспомогательный дочерний фрагмент категории, где тот же фрагмент (то же действие) с предыдущим родительским фрагментом, я получаю следующую ошибку:

2019-10-23 16:48:03.472 24670-24670/com.example.store E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.store, PID: 24670
java.lang.IllegalArgumentException: navigation destination com.example.store:id/action_catalogPage_to_subCatsPage is unknown to this NavController
    at androidx.navigation.NavController.navigate(NavController.java:789)
    at com.example.store.helpers.NavigationExtensionsKt.navigateSafe(NavigationExtensions.kt:271)
    at com.example.store.helpers.NavigationExtensionsKt.navigateSafe$default(NavigationExtensions.kt:266)
    at com.example.store.fragments.catalog.SubCatsPage.onItemClick(SubCatsPage.kt:78)
    at com.example.store.helpers.adapters.catalog.SubCatsAdapter$SubCatsItemHolder$bindTo$1.onClick(SubCatsAdapter.kt:75)
    at android.view.View.performClick(View.java:7125)
    at android.view.View.performClickInternal(View.java:7102)
    at android.view.View.access$3500(View.java:801)
    at android.view.View$PerformClick.run(View.java:27336)
    at android.os.Handler.handleCallback(Handler.java:883)
    at android.os.Handler.dispatchMessage(Handler.java:100)
    at android.os.Looper.loop(Looper.java:214)
    at android.app.ActivityThread.main(ActivityThread.java:7356)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)

Здесь навигация xml:

<?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/catalog"
    app:startDestination="@id/catalogPage">

    <fragment
        android:id="@+id/catalogPage"
        android:name="com.example.store.fragments.catalog.CatalogPage"
        android:label="fragment_catalog_page"
        tools:layout="@layout/fragment_catalog_page" >
        <action
            android:id="@+id/action_catalogPage_to_subCatsPage"
            app:destination="@id/catalogSubCatsPage" />
        <action
            android:id="@+id/action_catalogPage_to_catalogShowCatProductsPage"
            app:destination="@id/catalogShowCatProductsPage" />
    </fragment>

    <dialog
        android:id="@+id/productDetailSheet"
        android:name="com.example.store.fragments.products.ShowProductDetailsBottomSheet"
        tools:layout="@layout/fragment_dialog_pr_detail_secondary">

        <argument
            android:name="productId"
            app:argType="string"
            android:defaultValue='"0"' />
        <deepLink
            android:id="@+id/deepLink4"
            app:uri="https://com.example/p/{productId}"
            android:autoVerify="true" />
    </dialog>

    <fragment
        android:id="@+id/catalogSubCatsPage"
        android:name="com.example.store.fragments.catalog.SubCatsPage"
        android:label="SubCatsPage" />

    <fragment
        android:id="@+id/catalogShowCatProductsPage"
        android:name="com.example.store.fragments.products.ShowCatProductsPage"
        android:label="fragment_show_cat_products_page"
        tools:layout="@layout/fragment_show_cat_products_page" />
</navigation>

Кто-нибудь знает, как использовать один и тот же фрагмент, но несколько раз новые экземпляры с NavController?

1 Ответ

2 голосов
/ 23 октября 2019

Это может помочь опубликовать ваш навигационный график, но я думаю, что вы можете решить это одним из двух способов:

(1) локальное действие, доступное для фрагмента категории, или (2) глобальное действиедоступны для всего графика.

<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/nav_graph"
    app:startDestination="@id/category">

    <fragment
        android:id="@+id/category"
        android:name="com.example.app.CategoryFragment">

        <argument
            android:name="categoryId"
            app:argType="string"/>

        <!-- (1) Local action to self (category fragment) -->
        <action
            android:id="@+id/open_category"
            app:destination="@id/category"/>

    </fragment>

    <!-- (2) Global action to category fragment-->
    <action
        android:id="@+id/open_category_global"
        app:destination="@id/category"/>

</navigation>

В обоих случаях должен быть создан новый экземпляр фрагмента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...