在导航控制器上添加片段而不是替换片段?

Posted

技术标签:

【中文标题】在导航控制器上添加片段而不是替换片段?【英文标题】:Add fragment on navigation controller instead of replace fragment? 【发布时间】:2019-10-02 05:25:17 【问题描述】:

我正在使用导航控件(android 架构)。我使用了一些演示并创建了导航架构。但问题是,片段每次都会被召回,就像:当你从任何片段返回时替换片段。那么我该如何阻止这种情况,以及如何设置添加片段而不是替换片段之类的行为。

我在网络上发现了这个问题,但没有人告诉我如何在导航控件上添加/替换片段。我尝试使用片段 ID 来获取添加片段方法,但没有成功。

    这是我的导航主机 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/nav_graph"
            app:startDestination="@id/questionanswer">

            <fragment
                android:id="@+id/questionanswer"
                android:name="com.softtech360.totalservey.fragment.QuestionAnswer"
                android:label="fragment_first"
                tools:layout="@layout/questionanswer" >
                <action
                    android:id="@+id/action_questionanswer_to_questionanswer"
                    app:destination="@id/questionanswer"

                    />
            </fragment>
</navigation>
    我创建了一个按钮,每次我调用这个按钮来触发函数并交换主机片段上的片段:
val navController = Navigation.findNavController(activity!!,R.id.navhost_fragment)
                            navController.navigate(R.id.questionanswer)
        // using this i swap the fragment on host fragment.

【问题讨论】:

找到解决办法了吗? 您遇到的实际问题是什么?如果您实际上是saving your state,那么无论您使用添加还是替换,您的片段都将处于完全相同的状态。 【参考方案1】:

试试这个:

<action
    android:id="@+id/action_questionanswer_to_questionanswer"
    app:popUpTo="@+id/questionanswer"/>

而不是

<action
    android:id="@+id/action_questionanswer_to_questionanswer"
    app:destination="@id/questionanswer"/>

然后:

navController.navigate(R.id.action_questionanswer_to_questionanswer)

找到这个here

【讨论】:

【参考方案2】:

您需要使用popUpTopopUpToInclusive 来清除backstack。检查Android Developers docs

【讨论】:

【参考方案3】:

试试这个,不要将目的地更改为 popUpTop。

navController.navigate(R.id.action_questionanswer_to_questionanswer)

【讨论】:

以上是关于在导航控制器上添加片段而不是替换片段?的主要内容,如果未能解决你的问题,请参考以下文章

导航组件替换/更改后台堆栈

在导航抽屉上调用不是片段活动的活动

如何在底部导航中使用设置屏幕外页面限制

使用导航控制器创建两次的片段

BottomNavigation popBackStack() 导航到 startDestination 而不是上一个片段

选择导航菜单项时不会替换上一个片段