Android导航组件popUpTo behaviour

时间:2018-08-08 10:50:34

标签: android android-navigation android-architecture-navigation

我试图弄清楚如何跳过导航组件的后堆栈中的某些片段。我有这样的应用程序结构

- categories_fragment

    - category1_collection_fragment

        - category1_collection_item_view_fragment

        - category1_collection_item_edit_fragment

    - category2_collection_fragment

    ...etc

工作流程应如下所示:

  1. 用户进入应用程序-默认情况下,category_fragment是打开的
  2. 用户打开category1_collection_fragment
  3. 用户打开category1_collection_item_view_fragment
  4. 用户打开category1_collection_item_edit_fragment
  5. 用户编辑该项目并将其保存
  6. 向用户显示category1_collection_item_view_fragment
  7. 用户单击“后退”按钮,然后转到第2步,可以重复3到6个动作

这是导航图的样子:

<fragment
    android:id="@+id/categories_fragment"
    android:name="com.domain.CategoriesFragment">
    <action
        android:id="@+id/action_category1_collection_fragment"
        app:destination="@id/category1_collection_fragment" />
</fragment>

<fragment
    android:id="@+id/category1_collection_fragment"
    android:name="com.domain.category1.Category1CollectioNFragment">
    <action
        android:id="@+id/action_category_1_view_fragment"
        app:destination="@id/category1_view_fragment"/>
</fragment>

<fragment
    android:id="@+id/category1_view_fragment"
    android:name="com.domain.category1.Category1ViewFragment">
    <action
        android:id="@+id/action_view_fragment_to_edit_fragment"
        app:destination="@id/category1_edit_fragment" />
    <argument android:name="item" />
</fragment>

<fragment
    android:id="@+id/category1_edit_fragment"
    android:name="com.domain.category1.Category1EditFragment">
    <action
        android:id="@+id/action_edit_fragment_to_view_fragment"
        app:destination="@id/category1_view_fragment"
        app:popUpTo="@+id/profile_collection_fragment"/>
    <argument android:name="item" />
</fragment>

enter image description here

我已经实现的工作有点奏效,并且在编辑并单击“后退”按钮后将用户带到category1_collection_fragment,但是,尝试打开集合中的另一个/或相同项目时我崩溃了。 错误是此NavController未知导航目标。

我使用addOnNavigatedListener检查了在此周期内更改了哪些导航控制器目的地:

1. categories_fragment
this one is obvious it's open by default

2. category1_collection_fragment
when user click on the action that takes him to the collection

3. category1_collection_view_fragment
when the user selects an item from the collection and opens it

4. category1_collection_edit_fragment
when the user clicks to edit item

now this next part it vier 3 steps happen at the same time when
navigation controller executes : @id/action_edit_fragment_to_view_fragment 
5. category1_collection_view_fragment
6. category1_collection_fragment
7. category1_collection_view_fragment

so the last destination that has been placed it category1_collection_view_fragment and even though I see category1_collection_fragment open which is what I want the destination is

category1_collection_view_fragment,无法从中打开其他项目,当我崩溃时,就会崩溃。

这是怎么了?如何在不打开有关编辑片段的历史记录的情况下使项目保存打开的视图片段?

我正在考虑只使用findNavController()。popBackStack()而不是在保存后打开视图片段,但是我需要将更新的项目数据传递给视图片段,并且使用它我无法做到这一点。

编辑

在试图弄清楚发生了什么情况时,我注意到当使用带有setUpWithNavController的导航控制器来设置工具栏时,单击了导航上的图标,此后导航便按照我想要的方式工作了,但即使是使用后退按钮,情况也是如此尽管后退按钮将我带到了碎片,但我希望由于崩溃我无法从那里导航到其他地方

0 个答案:

没有答案