【问题标题】:Adding fragment manually into the backstack in Navigation Architecture Component在导航架构组件中手动将片段添加到后台堆栈中
【发布时间】:2021-03-04 10:27:55
【问题描述】:

我在导航图中有 4 个片段,名为 A、B、C、D,我正在从用户那里获取一些数据。

当我处于正常流程 (A->B->C->D) 并按下返回按钮时,一切正常(返回堆栈)。

但我有一个案例,我有并编辑信息流,假设用户将表单留在片段 D 上,所以当用户再次出现在屏幕上时,我必须在同一屏幕上导航用户,即片段 D。 我是通过 Deep-link 实现的。

现在的问题是在上述情况下,除了片段 D 之外,堆栈中不会有任何片段。但是我需要当用户按下返回按钮时 应该导航到片段 C 到片段 B 到片段 A .

意味着我希望将其他 Fragments(A,B,C) 添加到后台堆栈中。我们可以这样做吗?如果可以,如何做?

===这里是代码===

my_navigation_graph.xml.

<fragment
    android:id="@+id/aFragment"
    android:name="in.demo.project.AFragment"
    android:label="AFragment"
    tools:layout="@layout/fragment_a_layout">
    <deepLink
        android:id="@+id/deepLink"
        android:autoVerify="true"
        app:uri="demo://editflow?is_for_edit={is_for_edit}&amp;step={step}" />
    <argument
        android:name="is_for_edit"
        android:defaultValue="false"
        app:argType="boolean" />
    <argument
        android:name="step"
        android:defaultValue="2"
        app:argType="string" />

    <action
        android:id="@+id/action_aFragment_to_bFragment"
        app:destination="@id/bFragment"/>

    <action
        android:id="@+id/action_aFragment_to_cFragment"
        app:destination="@id/cFragment"/>
    <action
        android:id="@+id/action_aFragment_to_dFragment"
        app:destination="@id/dFragment"/>


<fragment
    android:id="@+id/bFragment"
    android:name="in.demo.project.BFragment"
    android:label="BFragment"
    tools:layout="@layout/fragment_b_layout">
    <action
        android:id="@+id/action_bFragment_to_cFragment"
        app:destination="@id/cFragment" />
</fragment>

<fragment
    android:id="@+id/cFragment"
    android:name="in.demo.project.CFragment"
    android:label="CFragment"
    tools:layout="@layout/fragment_c_layout">

    <action
        android:id="@+id/action_cFragment_to_dFragment"
        app:destination="@id/dFragment" />

</fragment>
<fragment
    android:id="@+id/dFragment"
    android:name="in.demo.project.DFragment"
    android:label="DFragment"
    tools:layout="@layout/fragment_d_layout">
    
</fragment>

浏览。

findNavController().navigate(AFragmentDirections.actionAFragmentToBFragment())

在 AFragment 内部,我重定向到其他片段,假设 为每个片段创建深层链接并不是好的做法。

这段代码在onCreate()AFragment方法

arguments?.let {
            if (AFragmentArgs.fromBundle(it).isForEdit) {
                redirectionForEdit(AFragmentArgs.fromBundle(it).step)
            } 
        }

还有一个重定向功能

  private fun redirectionForEdit(step: String) {
        when (step) {
            "2" ->
                findNavController().navigate(AFragmentDirections.actionAFragmentToBFragment())
            "3" ->
                findNavController().navigate(AFragmentDirections.actionAFragmentToCFragment())
            "4" ->
                findNavController().navigate(AFragmentDirections.actionAFragmentToDFragment())  

        }

    }

现在如果我在步骤中得到 4,它将重定向到 DFragment,因此堆栈将为 A->D,但我也希望 B 和 D 进入堆栈(A->B->C- >D)。

【问题讨论】:

  • 查看文档似乎说如果您的图表设置正确,它会自动执行此操作,请看这里:developer.android.com/guide/navigation/…。如果这不起作用,可以发布一些您尝试过的代码示例?
  • 如果我们进行这种深度链接,假设在片段 D 上,A B C 不会添加到 backstack 中。过段时间贴出代码

标签: android uinavigationcontroller back-stack android-deep-link navigation-architecture


【解决方案1】:

请参考handling custom back navigation under navigation components

OnBackPressedCallback callback = new OnBackPressedCallback(true /* enabled by default */) {
        @Override
        public void handleOnBackPressed() {
            // Handle the back button event
        }
    };
    requireActivity().getOnBackPressedDispatcher().addCallback(this, callback);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    • 1970-01-01
    相关资源
    最近更新 更多