将导航 UI 与导航抽屉一起使用时,片段不会添加到后台堆栈

Max*_*her 3 android android-fragments navigation-drawer android-jetpack android-architecture-navigation

I\xc2\xb4m 使用 Android 导航组件创建带有导航抽屉的应用程序。但是,如果通过导航抽屉更改当前片段,然后按回,应用程序始终返回到导航图的起始片段。\n我只能找到如何在使用导航组件时从 Backstack 中删除片段的解决方案,但无法找到如何添加它们。

\n\n

我\xc2\xb4ve 已经将其他片段添加为NavController 的AppBarConfiguration 中的根片段,但这不会改变\xc2\xb4t 的行为。\n在应用程序的其他部分使用标准时,navController.navigate()片段会正确添加到 Backstack 中。仅当我从导航抽屉切换片段时,它们才会添加到 Backstack 中。

\n\n

我\xc2\xb4ve 还尝试更改片段之间的操作(例如popUpTopopUpToInclusive),但似乎导航组件\xc2\xb4t 没有使用这些,因为它\xc2\xb4t 不会更改任何内容。

\n\n

MainActivity.java

\n\n
@Override\nprotected void onCreate(Bundle savedInstanceState) {\n    super.onCreate(savedInstaceState);\n    setContentView(R.layout.activity_main);\n\n    DrawerLayout drawer_layout = findViewById(R.id.drawer_layout);\n    NavigationView navigationView = findViewById(R.id.nav_view);\n\n    navController = Navigation.findNavController(this, R.id.nav_host_fragment);\n\n    appBarConfiguration = new AppBarConfiguration.Builder(R.id.homeFragment, R.id.Fragment1,\n                          R.id.Fragment2, R.id.Fragment3).setDrawerLayout(drawer_layout).build();\n\n    NavigationUI.setupWithNavController(navigationView, navController);\n    NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);\n\n    Toolbar toolbar = findViewById(R.id.toolbar);\n    setSupportActionBar(toolbar);\n}\n\n@Override\npublic boolean onSupportNavigateUp() {\n    navController = Navigation.findNavController(this, R.id.nav_host_fragment);\n    return NavigationUI.navigateUp(navController, appBarConfiguration) || super.onSupportNavigateUp();\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

nav_graph.xml

\n\n
@Override\nprotected void onCreate(Bundle savedInstanceState) {\n    super.onCreate(savedInstaceState);\n    setContentView(R.layout.activity_main);\n\n    DrawerLayout drawer_layout = findViewById(R.id.drawer_layout);\n    NavigationView navigationView = findViewById(R.id.nav_view);\n\n    navController = Navigation.findNavController(this, R.id.nav_host_fragment);\n\n    appBarConfiguration = new AppBarConfiguration.Builder(R.id.homeFragment, R.id.Fragment1,\n                          R.id.Fragment2, R.id.Fragment3).setDrawerLayout(drawer_layout).build();\n\n    NavigationUI.setupWithNavController(navigationView, navController);\n    NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);\n\n    Toolbar toolbar = findViewById(R.id.toolbar);\n    setSupportActionBar(toolbar);\n}\n\n@Override\npublic boolean onSupportNavigateUp() {\n    navController = Navigation.findNavController(this, R.id.nav_host_fragment);\n    return NavigationUI.navigateUp(navController, appBarConfiguration) || super.onSupportNavigateUp();\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

当从 切换Fragment1Fragment2然后按返回时,我希望应用程序返回到Fragment1,但应用程序却重定向到homeFragment。\n是否有任何方法可以防止导航组件始终返回到起始片段而不是上一个片段?

\n\n

非常感谢

\n

Max*_*her 5

I\xc2\xb4ve 设法生成所需的行为。我只是忽略了文档的相关部分。正如NavigationUI 文档中所述,您需要添加android:menuCategory = "secondary"到导航视图菜单中的菜单项。通过在 XML 文件中添加此行,当切换到相应的 Fragment 时,backstack 不会弹出\xc2\xb4t,因此应用程序在按回键时会返回到上一个 Fragment。

\n