Android返回键按下时如何从第6个Fragment直接跳转至第1个?
实现从第6个Fragment直接返回至第1个Fragment的方法
针对你的需求,这里提供两种常见实现方案,根据你使用的Fragment管理方式选择:
方案一:使用原生FragmentManager管理
在你的宿主Activity中重写onBackPressed()方法,拦截返回键事件并处理:
@Override public void onBackPressed() { // 获取当前显示的Fragment Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container); // 判断当前是否是第6个Fragment(替换成你实际的第6个Fragment类名) if (currentFragment instanceof SixthFragment) { // 清空整个Fragment回退栈,移除中间所有Fragment getSupportFragmentManager().popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); // 切换到第1个Fragment(替换成你实际的第1个Fragment类名) getSupportFragmentManager().beginTransaction() .replace(R.id.fragment_container, new FirstFragment()) // 若希望回到第1个Fragment后按返回键直接退出应用,删除下面这行 .addToBackStack(null) .commit(); } else { // 其他Fragment按默认返回逻辑处理 super.onBackPressed(); } }
关键说明:
- 把
R.id.fragment_container替换成你布局中存放Fragment的容器ID - 替换
SixthFragment和FirstFragment为你项目中对应的Fragment类名 POP_BACK_STACK_INCLUSIVE参数会彻底清空回退栈,确保中间Fragment不会残留- 如果第1个Fragment是应用首页,建议删除
.addToBackStack(null),这样回到首页后按返回键会直接退出应用
方案二:使用Navigation Component(Android推荐)
如果你用Jetpack Navigation管理Fragment,同样在宿主Activity中重写onBackPressed():
@Override public void onBackPressed() { NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment); // 判断当前是否在第6个Fragment(替换成你导航图中第6个Fragment的ID) if (navController.getCurrentDestination() != null && navController.getCurrentDestination().getId() == R.id.sixth_fragment) { // 直接导航到第1个Fragment,并清空中间所有页面的回退栈 navController.navigate(R.id.first_fragment, null, new NavOptions.Builder() // true表示连第1个Fragment也从栈中移除,重新添加;false则保留原有第1个Fragment .setPopUpTo(R.id.first_fragment, true) .build()); } else { super.onBackPressed(); } }
关键说明:
- 把
R.id.nav_host_fragment替换成你布局中NavHostFragment的ID R.id.sixth_fragment和R.id.first_fragment替换成你导航图中对应的目的地IDsetPopUpTo的第二个参数设为true,会清空回退栈中所有页面(包括第1个),然后重新添加第1个Fragment;设为false则保留原有的第1个Fragment,仅移除中间页面
内容的提问来源于stack exchange,提问作者Vivek M Fauzdar
相关产品推荐
相关产品推荐

