Android中如何点击底部导航返回HomeFragment根页面?
解决方案:点击底部导航回到HomeFragment根页面
问题原因
Navigation Component 默认会保留每个底部导航目的地的回退栈状态。当你从HomeFragment跳转到DetailFragment后,HomeFragment对应的回退栈里会包含这两个页面;切换到其他底部菜单项再切回HomeFragment时,会回到回退栈的顶部(也就是DetailFragment),而非根页面。
官方推荐解决方法(适配2.7.7版本)
通过配置AppBarConfiguration,将所有底部导航的目的地标记为顶级目的地,点击底部菜单项时会自动弹出该目的地回退栈中所有非根页面,直接回到根Fragment。
修改MainActivity中的代码:
NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager() .findFragmentById(R.id.nav_host_fragment); NavController navController = navHostFragment.getNavController(); bottomNavigationView = findViewById(R.id.bottom_navigation); // 创建AppBarConfiguration,包含所有底部导航菜单项的ID AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder( R.id.homeFragment, R.id.secondFragment) // 把所有底部菜单项ID都添加进来 .build(); // 使用带AppBarConfiguration的重载方法设置导航关联 NavigationUI.setupWithNavController(bottomNavigationView, navController, appBarConfiguration);
备选手动处理方案
如果需要更自定义的行为,可以手动监听底部导航的点击事件,强制跳转时清空回退栈到根页面:
bottomNavigationView.setOnItemSelectedListener(item -> { int itemId = item.getItemId(); if (itemId == R.id.homeFragment) { // 跳转到HomeFragment,弹出其回退栈中所有非根页面(保留HomeFragment) navController.navigate(itemId, null, new NavOptions.Builder() .setPopUpTo(itemId, false) // false:保留根页面,弹出上方所有页面 .setLaunchSingleTop(true) // 避免重复创建Fragment实例 .build()); return true; } else if (itemId == R.id.secondFragment) { navController.navigate(itemId, null, new NavOptions.Builder() .setPopUpTo(itemId, false) .setLaunchSingleTop(true) .build()); return true; } return NavigationUI.onNavDestinationSelected(item, navController); });
补充说明
确保你的nav_graph.xml中,HomeFragment是nav_host_fragment的起始目的地(即app:startDestination="@id/homeFragment"),并且DetailFragment是从HomeFragment导航过去的子目的地,没有被设置为底部导航的菜单项。
内容的提问来源于stack exchange,提问作者polyte
相关产品推荐
相关产品推荐

