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

弹出窗口在导航组件中似乎不起作用

方茂
2023-03-14

所以我在使用android导航组件,我有一个问题(2.2.0-rc04版本)。

我有一个welcomeFragment(wF)。我想从wF导航到另一个导航图中的lSF。我也不想在导航到lSF时从backstack(poputto,popuptinclusive)中删除wF,因为用户可能想返回它。

<fragment
    android:id="@+id/welcomeFragment">
    <action
        android:id="@+id/action_welcomeFragment_to_nav_onboarding_seller"
        app:launchSingleTop="true"
        app:destination="@id/nav_onboarding_seller" />
</fragment>

导航到lSF后,后退如下所示:wF lSF

我们现在在lSF上,登录后我们想进入feedFragment(fF),它同样在一个单独的图中,但这次我们想清除所有的后退,因为如果用户登录并按下后退键,他希望应用程序退出,而不是将他带回wF或lSF,因此,我在从lSF到fF的动作中使用了poputo=“@id/loginSellerFragment popuptinclusive='true”

<fragment
    android:id="@+id/loginSellerFragment">
    <action
        android:id="@+id/action_login_to_seller"
        app:destination="@+id/seller" . //this is the graph that has as firstDestination, feedFragment
        app:launchSingleTop="true"
        app:popUpTo="@id/loginSellerFragment"
        app:popUpToInclusive="true" />
</fragment>

所以在这一刻的后台应该只有fF,因为我们删除了所有直到lSFlSF包括在内)

问题所在

当我在fF并按回时,应用程序不会关闭,而是将我带到wFwF应该已经从后台弹出)

我试过的

我试过使用poputo=“@id/loginSellerFragment-poputoinclusive='true”,而不是使用poputo=“@id/welcomeFragment-poputoinclusive='true”,效果很好,但我很确定这不是应该做的。伙计们,我错过了什么?我是不是把后挡板造错了?

此外,我尝试添加popUpTo="@id/welcomFrament popUpTo包容性='true"后,从wF导航到lSF,但这将破坏我的用户体验,因为我不希望应用程序退出时,我还在登录过程中。

请注意,所有这些片段都在单独的图中。为了导航,我使用了碎片方向,例如:findNavController。导航(WelcomeFramgentDirections.actionXtoY())

共有2个答案

白侯林
2023-03-14

对我来说,设置XML代码并没有真正解决这个问题,只能使用额外的一行代码

  findNavController()
                .navigate(R.id.navigationFragment,
                    null,
                    NavOptions.Builder()
                        .setPopUpTo(R.id.splashFragment,
                            true).build()
                )
王涵育
2023-03-14

当您使用popUpTo选项时,要掌握导航组件如何操作背包并不容易。

您在问题中提到的解决方案是正确的:您确实应该使用poputto=“@id/welcomeFragment”poputoinclusive=“true”,而不是poputto=“@id/loginSellerFragment”poputoinclusive=“true”

我会尽力解释原因。

>

  • 当您启动应用程序时,您的Backback将为空,并且将显示welcomeFragment。

    当您从welcomFrament导航到loginSellerFrament时,您的后端堆栈中将包含welcomFrament

    如果你登录,你将从loginSellerFragment导航到feedFragment,在Backback中你将拥有loginSellerFragment和welcomeFragment。

    由于您使用了“poputo=”@id/welcomeFragment“,应用程序将开始从您的backbackback中弹出(删除)片段,直到到达“welcomeFragment”。由于我们使用了poputpinclusive=“true”,welcomeFragment也将被删除。

    Backstack的行为应该类似于FILO(First In Last Out)堆栈,因此它将以这种方式删除片段:

    首先,将删除顶部片段,即loginSellerFragment。

    接下来,welcomFrament将是顶部片段。由于我们需要弹出片段,直到到达welcomFrament这是我们停止的地方,但是welcomFrament也将被删除,因为popUpTo包容性="true"并且您的后台将是空的。

    如果您尝试从welcomFrament导航回来,您将退出应用程序,因为您的背包是空的。

    我希望这会有所帮助。您还可以阅读有关堆栈数据结构的更多信息。

  •  类似资料:
    • 我是Java新手,正在努力学习。我目前陷入困境,不知道为什么无法从文件夹导入。

    • 我的代码看起来像 我的文件如下所示 当我运行程序时,我看到 我怎样才能修好它呢?

    • 我们试图在Apache Beam管道上使用固定窗口(使用)。我们的流程如下: 从pub/sub中提取数据 反序列化JSON到Java对象 窗口事件w/固定窗口5秒 使用自定义的,将事件的每个窗口合并成一个

    • 问题内容: 我在使用该功能时遇到了麻烦。 我只需要知道SQL查询是否返回零行。 我已经尝试过以下简单的语句: 类型是哪里。上面的代码似乎不起作用。无论是否为空,它将始终打印该消息。 我检查了SQL查询本身,当存在行时它正确返回了非空结果。 关于如何确定查询是否已返回0行的任何想法?我用谷歌搜索,找不到任何答案。 问题答案: ResultSet.getFetchSize()不返回结果数!从这里: 使

    • 我有一个工作流,它执行一系列模糊测试,最后计算所有崩溃程序子目录中的文件总数。后来,在另一份工作中,我使用该号码向Slack发送通知。但是,由于某些原因,不会产生任何输出,最重要的是,即使崩溃程序的数量不是零,下一个作业也不会运行! 有人知道我做错了什么吗?谢谢!

    • 我在Windows上,我已经在环境变量中设置了JDK 1.8的路径。同样在项目结构方面,我已经改变了。我有一个Maven项目。 在命令行中,如果我使用“mvn--version”,我会看到 然而,在IntelliJ中,如果我点击Run按钮,它总是指向JDK 1.7,并抛出一个错误(因为我的maven项目需要java 8)。我该怎么改变呢?谢谢 更新在遵循@BevyQ提示后,我发现Maven run