gpt4 book ai didi

android - 导航组件 NavDeepLinkBuilder 返回堆栈

转载 作者:行者123 更新时间:2023-12-05 00:03:34 27 4
gpt4 key购买 nike

我在从深层链接(通过通知)启动应用程序时遇到了返回堆栈问题。

总体思路是我有 3 个 fragment (A、B、C)。 A 屏幕用作初始屏幕,因此我将 popUpTopopUpToInclusive 放入操作中,这样我就再也看不到它了。我的深层链接目标是 fragment C。为了实现正确的返回堆栈,我将 B 和 C 合并到嵌套导航中。不幸的是,当我在 fragment B 中按下后退按钮时,应用程序显示 fragment A。我猜这是因为当应用程序从深层链接本身启动时,从未调用从 A 到 B 的操作 popUpTo .我的问题是:如何避免在这种特定情况下从 B 返回到 A?

提前致谢!我附上示例代码:

<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/splashFragment">

<fragment
android:id="@+id/A"
android:name="A"
android:label="A" >
<action
android:id="@+id/action_A_to_B"
app:destination="@id/B"
app:popUpTo="@id/A"
app:popUpToInclusive="true" />
</fragment>
<navigation android:id="@+id/nested_nav"
app:startDestination="@id/B">
<fragment
android:id="@+id/B"
android:name="B"
android:label="B">
<action
android:id="@+id/action_B_to_C"
app:destination="@id/C" />
</fragment>
<fragment
android:id="@+id/C"
android:name="C"
android:label="C">
</fragment>
</navigation>
</navigation>

还有我的 DeepLinkBuilder(没什么特别的,和文档一样)

NavDeepLinkBuilder(requireContext())
.setGraph(R.navigation.nav_graph)
.setDestination(R.id.userProfileFragment)
.createPendingIntent()
.send()

最佳答案

您已将包含初始屏幕的 navGraph 设置为默认的 startDestination,这会导致在您从嵌套的 navGraph 中按下后退按钮时显示它,我认为最简单的解决方案是执行以下操作:首先编辑您的导航文件,使其只有一个导航,例如:

<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/splashFragment">

<fragment
android:id="@+id/A"
android:name="A"
android:label="A" >
<action
android:id="@+id/action_A_to_B"
app:destination="@id/B"
app:popUpTo="@id/A"
app:popUpToInclusive="true" />
</fragment>
<fragment
android:id="@+id/B"
android:name="B"
android:label="B">
<action
android:id="@+id/action_B_to_C"
app:destination="@id/C" />
</fragment>
<fragment
android:id="@+id/C"
android:name="C"
android:label="C">
</fragment>
</navigation>

其次为 navController 设置一个监听器以在发生目的地更改时进行监听,如下所示:

yourNavController.setOnDestinationChangedListener(this);

覆盖 onDestinationChangedListener() 方法并检查即将显示的 fragment 是否为 A ,然后像这样完成应用程序:

@override 
public void onDestinationChanged(NavController controller, NavDestination destination, Bundle arguments){
if(destination.getId()==R.id.splashFragmentId){
finish();
}
}

关于android - 导航组件 NavDeepLinkBuilder 返回堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66144640/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com