Android 导航问题:多个返回堆栈

Gra*_*ray 6 android android-navigation android-navigationview android-navigation-bar android-navigation-graph

我的问题是,当我尝试使用底部导航更改片段时,它会起作用,但在一种情况下除外。我有 5 个片段,当我进入第 3 个片段并进入第 5 个片段后,第 5 个片段的图标 don\xc2\xb4t 改变了它的颜色。之后,当我进行另一次导航时,应用程序崩溃并给出下一个错误:

\n
java.lang.IndexOutOfBoundsException: fromIndex = -1\n    at java.util.ArrayList.subListRangeCheck(ArrayList.java:1014)\n    at java.util.ArrayList.subList(ArrayList.java:1008)\n    at androidx.navigation.fragment.FragmentNavigator.popBackStack(FragmentNavigator.kt:80)\n    at androidx.navigation.NavController.popBackStackInternal(NavController.kt:275)\n    at androidx.navigation.NavController.popBackStackInternal(NavController.kt:558)\n    at androidx.navigation.NavController.navigate(NavController.kt:1682)\n    at androidx.navigation.NavController.navigate(NavController.kt:1541)\n    at androidx.navigation.NavController.navigate(NavController.kt:1468)\n    at androidx.navigation.ui.NavigationUI.onNavDestinationSelected(NavigationUI.kt:92)\n    at androidx.navigation.ui.NavigationUI.setupWithNavController$lambda-6(NavigationUI.kt:602)\n    at androidx.navigation.ui.NavigationUI.$r8$lambda$6wzEv9QqEZKdQFS1sQQy-bdQvgE(Unknown Source:0)\n    at androidx.navigation.ui.NavigationUI$$ExternalSyntheticLambda2.onNavigationItemSelected(Unknown Source:2)\n    at com.google.android.material.navigation.NavigationBarView$1.onMenuItemSelected(NavigationBarView.java:295)\n    at androidx.appcompat.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:834)\n    at androidx.appcompat.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:158)\n    at androidx.appcompat.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:985)\n    at com.google.android.material.navigation.NavigationBarMenuView$1.onClick(NavigationBarMenuView.java:133)\n    at android.view.View.performClick(View.java:7520)\n    at android.view.View.performClickInternal(View.java:7489)\n    at android.view.View.access$3600(View.java:826)\n    at android.view.View$PerformClick.run(View.java:28555)\n    at android.os.Handler.handleCallback(Handler.java:938)\n    at android.os.Handler.dispatchMessage(Handler.java:99)\n    at android.os.Looper.loop(Looper.java:233)\n    at android.app.ActivityThread.main(ActivityThread.java:8010)\n    at java.lang.reflect.Method.invoke(Native Method)\n    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:631)\n    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:978)\n
Run Code Online (Sandbox Code Playgroud)\n

但是,如果之前我单击了第 5 个片段并转到第 3 个片段,然后在第 5 个片段之后再次单击,则它可以正常工作。

\n

对于我的代码,我遵循本教程 ,并且两种情况下的代码都是相同的。

\n

编辑:这是我在 MainActivity 中添加导航的代码:

\n
override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    binding = ActivityMainBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n    if(savedInstanceState == null){\n        setupBottomNavigationBar()\n    }\nprivate fun setupBottomNavigationBar(){\n     val graphs = setOf(\n            R.id.firstFragment,\n            R.id.secondFragment,\n            R.id.thirdFragment,\n            R.id.fourthFragment,\n            R.id.fithFragment\n     )\n    val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_container) as NavHostFragment\n\n    currentNavController = navHostFragment.navController\n\n    val bottomNavigation = findViewById<BottomNavigationView>(R.id.bottom_navigation)\n    bottomNavigation.setupWithNavController(currentNavController)\n    appBarConfiguration = AppBarConfiguration(graphs)\n}\n
Run Code Online (Sandbox Code Playgroud)\n

活动主文件

\n
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"\nxmlns:app="http://schemas.android.com/apk/res-auto"\nxmlns:tools="http://schemas.android.com/tools"\nandroid:layout_width="match_parent"\nandroid:layout_height="match_parent"\nandroid:orientation="vertical"\ntools:context=".activities.MainActivity">\n<androidx.fragment.app.FragmentContainerView\n    android:id="@+id/nav_host_container"\n    android:layout_width="match_parent"\n    android:layout_height="0dp"\n    android:layout_weight="1"\n    android:name="androidx.navigation.fragment.NavHostFragment"\n    app:defaultNavHost="true"\n    app:navGraph="@navigation/super_nav"\n    />\n<com.google.android.material.bottomnavigation.BottomNavigationView\n    android:id="@+id/bottom_navigation"\n    android:layout_width="match_parent"\n    android:layout_height="wrap_content"\n    app:menu="@menu/bottom_nav"\n    app:itemIconTint="@drawable/botton_navigation_colors"\n    app:labelVisibilityMode="unlabeled"\n    app:itemIconSize="35dp"\n    />\n
Run Code Online (Sandbox Code Playgroud)\n\n

底部导航.xml

\n
<menu xmlns:android="http://schemas.android.com/apk/res/android">\n<item\n    android:id="@+id/first_navigation"\n    android:icon="@drawable/ic_first_black"\n    android:contentDescription="@string/first_desc"\n    android:title="@string/first_title" />\n\n<item\n    android:id="@+id/second_navigation"\n    android:icon="@drawable/ic_second"\n    android:contentDescription="@string/second_desc"\n    android:title="@string/second_title" />\n\n<item\n    android:id="@+id/third_navigation"\n    android:icon="@drawable/ic_third"\n    android:contentDescription="@string/third_desc"\n    android:title="@string/third_title" />\n\n<item\n    android:id="@+id/fourth_navigation"\n    android:icon="@drawable/ic_fourth"\n    android:contentDescription="@string/fourth_desc"\n    android:title="@string/fourth_title" />\n\n<item\n    android:id="@+id/fifth_navigation"\n    android:icon="@drawable/ic_fifth"\n    android:contentDescription="@string/fifth_desc"\n    android:title="@string/fifth_title" />\n
Run Code Online (Sandbox Code Playgroud)\n\n

和 super_nav.xml

\n
<navigation xmlns:android="http://schemas.android.com/apk/res/android"\nxmlns:app="http://schemas.android.com/apk/res-auto"\nandroid:id="@+id/super_nav"\napp:startDestination="@+id/main_navigation">\n\n<include app:graph="@navigation/first_navigation"/>\n<include app:graph="@navigation/second_navigation"/>\n<include app:graph="@navigation/third_navigation" />\n<include app:graph="@navigation/fourth_cart_navigation" />\n<include app:graph="@navigation/fifth_navigation" />\n
Run Code Online (Sandbox Code Playgroud)\n\n

小智 4

我刚刚解决了非常类似的问题。我的问题是,我在多个导航子图中具有相同 id 的目的地。我是说:

<include app:graph="@navigation/first_sub_graph"/>
<include app:graph="@navigation/second_sub_graph"/>

<navigation
    android:id="@+id/first_sub_graph"
    ..>

    ...
    <fragment
        android:id="@+id/**destinationID_1**"
        ...
    />
</navigation>

<navigation
    android:id="@+id/second_sub_graph"
    ..>

    ...
    <fragment
        android:id="@+id/**destinationID_1**"
        ...
    />
</navigation>      
Run Code Online (Sandbox Code Playgroud)