当前位置: 首页 > 知识库问答 >
问题:

Android NavController:如何用相同的动作打开相同的片段

白越
2023-03-14

我有类别片段和子类片段用于输入要查看的类别子类。我在导航图xml中有操作来打开子类片段。如果我打开任何根类别并单击其任何子类别,那么如果单击的子曲库有子曲库,那么当用户单击它的子曲库时,我应该打开子类片段。有像树一样的方案:

根类别片段:

子类别片段:

下一个子类别片段:

当我单击最后一个子类别片段,其中与前一个父片段相同的片段(相同的操作)时,我得到以下错误:

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中多次使用相同片段但新的多个实例吗?

共有2个答案

李和昶
2023-03-14

您只需将目标ID设置为与片段ID相同。

就像下面

<fragment
        android:id="@+id/externalProfileFragment"
        android:name="com.social.footprint.ui.external_user_profile.ExternalProfileFragment"
        android:label="ExternalProfileFragment"
        tools:layout="@layout/external_profile_fragment">
        <argument
            android:name="user_id"
            app:argType="string" />
        <action
            android:id="@+id/action_externalProfileFragment_to_externalProfileFragment"
            app:destination="@id/externalProfileFragment" />


</fragment>
穆德海
2023-03-14

发布导航图可能会有所帮助,但我认为您可以通过以下两种方式之一来解决此问题:

(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>

在这两种情况下,都应该创建片段的新实例。

 类似资料:
  • 问题内容: 我有以下代码来获取地图: 如何打印带有重复键的消息“重复键”? 问题答案: 如何打印带有重复键的消息“重复键”? 使用当前代码,您将收到消息“重复键”,其中包含至少2个实例的列表,这些实例具有与对象相同的值,例如。 如何获得对应的密钥? 到目前为止,还无法获得相应的键,当前从合并功能中获得的实际上是与相同键映射的2个值,这些值需要合并以仅保留对应键的一个值。 您的问题是 Java 9

  • 我可以同时使用“来自表单”和“从正文”属性来操作吗?

  • 我想从我的React应用程序中的不同组件中打开一个模态,比如“用户登录模态”。例如:我希望模态从,和打开。所以我做了一个新的组件,其中包含modal,我将其导入到,和中。 现在的问题是,我必须在所有3个组件中维护状态,以便显示/隐藏模态。无论如何,我必须保持一个单一的状态。 一种方法是在父组件中维护状态。但是有没有更好的办法?

  • 问题内容: 简而言之,举一个例子,我基本上有一个包含3个活动的应用程序:Activity1 Activity2 StartActivity StartActivity包含两个分别与其他两个活动相对应的按钮,以将其启动。如果我从Activity1退出该应用程序,则稍后在手机中单击该应用程序图标时,由于Android会跟踪该事件,因此Activity1将重新启动。我需要重新启动应用程序才能将我带到St

  • 目前,我有一个类分数,它允许我用三种不同的方式创建分数 对于一个整数,在这种情况下,给定的整数将是分子,分母将设置为1 有2个整数,分子和分母 最后一种方法是解析一个字符串,该字符串必须与REGEX-?\d/[1-9]\d* gcd将尽可能减少生成的分数。 我现在想实现的是,具有相同分子和分母的分数实例具有相同的引用例如。 应该返回true。 我研究了一些关于泛型和边界的章节,但我不确定这是否是我

  • 问题内容: 示例ViewModel: 主要活动: 我想调用第二个活动并使MainActivity接收更改。那可能吗? 问题答案: 调用时,您实际上创建/保留了绑定到的,因此不同的Activity具有不同的特性,并且每个Activity 使用给定的工厂创建a的不同实例,因此您不能在不同的s中具有相同的a实例。 但是,您可以通过传递自定义ViewModel工厂的单个实例(充当单例工厂)来实现此目的,因