使用导航组件实现 BottomNavigationView 后退按钮的行为

3

我已为Android Navigation组件创建了一个nav_graph.xml,并添加了四个不同视图的碎片。现在添加了BottomNavigationView和菜单项,使用nav_graph中的fragment ids,并将这些ids提供给底部导航栏中的每个菜单项。它可以工作并显示所选底部导航栏菜单项对应的特定碎片。

<menu xmlns:android="http://schemas.android.com/apk/res/android">
     <item android:id="@+id/nav_fragmentA"
          android:title="@string/menu_search"
          android:icon="@drawable/ic_search" />
     <item android:id="@+id/nav_fragmentB"
          android:title="@string/menu_settings"
          android:icon="@drawable/ic_add" />
     <item android:id="@+id/nav_fragmentC"
          android:title="@string/menu_navigation"
          android:icon="@drawable/ic_action_navigation_menu" />
     <item android:id="@+id/nav_fragmentD"
          android:title="@string/menu_navigation"
          android:icon="@drawable/ic_action_navigation_menu" />
 </menu>

问题: 当用户多次按任何菜单项并按返回按钮时,它会通过整个后退堆栈导航,而不是转到第一个菜单项并退出应用程序。
例如
四个底部菜单项:A B C D 用户导航:A->C->B->D->B->C-A->D 返回按钮行为:D->A->C->B->D-B->C->A->Exit(与用户导航相反)
想要实现以下行为:
用户通过菜单项导航:A->C->B->D->B->C-A->D(任意随机导航) 后退按钮:D->A->Exit(从任何选择的项目到第一个项目,然后退出)

1
你能发布定义操作的代码吗? - VVB
2
@VVB 如果底部导航菜单项提供了与 nav_graph.xml 中相同的片段 ID,则无需定义任何显式操作即可正常工作。 - takharsh
如果是这种情况,您能展示一下处理替换片段的代码吗? - VVB
2
@VVB 我没有显式的代码来处理片段切换,这是由导航组件处理的。请参考此处的参考实现 https://github.com/android/architecture-components-samples/blob/master/NavigationAdvancedSample/app/src/main/res/menu/bottom_nav.xml 以及 https://github.com/android/architecture-components-samples/tree/master/NavigationAdvancedSample/app/src/main/res/navigation - takharsh
1个回答

2

我曾经遇到过同样的问题。

底部导航和导航组件之间的集成需要为每个片段/选项卡创建单独的导航图以及一个包含所有这些选项卡的父导航图。

父导航图不能包含任何其他片段。它只能包含每个选项卡的include标签。

示例:

    <?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"
    app:startDestination="@id/home"
    android:id="@+id/bottom_nav">

    <include app:graph="@navigation/frag1" />
    <include app:graph="@navigation/frag2" />
    <include app:graph="@navigation/frag3" />

</navigation>

架构组件提供的示例也很有帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接