实现带溢出菜单的App Bar时返回箭头消失、点击返回空白屏问题
问题修复方案
1. 向上箭头显示优化(可选)
你当前已解决箭头显示问题,更规范的写法是将getSupportActionBar().setDisplayHomeAsUpEnabled(true);移动到onCreate方法的setSupportActionBar(binding.toolbar)语句之后,不需要每次加载选项菜单时重复设置。
2. 空白屏问题核心修复
空白屏的根本原因是两个错误逻辑叠加:
- 你在
onSupportNavigateUp方法中额外调用了onBackPressed(),点击向上箭头时会执行两次回退操作,直接将回退栈中的Fragment全部弹出 - 除SettingsFragment外,另外两个切换的Fragment没有添加到回退栈,回退时没有可恢复的页面内容
具体修改步骤
第一步:修复回退逻辑
修改onSupportNavigateUp方法,删除多余的onBackPressed()调用:
@Override public boolean onSupportNavigateUp() { NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_content_main); return NavigationUI.navigateUp(navController, appBarConfiguration) || super.onSupportNavigateUp(); }
第二步:统一导航逻辑(二选一即可)
方案A:推荐使用Navigation组件原生导航(避免回退栈混乱)
你当前混合使用Navigation组件和原生FragmentTransaction,回退栈由两套逻辑分别管理容易出问题,建议统一用Navigation导航:
- 先将三个目标Fragment添加到你的
nav_graph导航图中,分别配置对应的导航id,比如action_to_settings、action_to_kyc、action_to_about - 替换
onOptionsItemSelected的实现:
@Override public boolean onOptionsItemSelected(MenuItem item) { NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_content_main); int id = item.getItemId(); switch (id) { case R.id.action_settings: navController.navigate(R.id.action_to_settings); break; case R.id.action_kyc: navController.navigate(R.id.action_to_kyc); break; case R.id.action_about: Bundle bundle = new Bundle(); bundle.putString("help_desc", getResources().getString(R.string.pBasics_desc)); bundle.putString("help_image","basic"); navController.navigate(R.id.action_to_about, bundle); break; default: return super.onOptionsItemSelected(item); } return true; }
方案B:保留原生FragmentTransaction的修改方式
如果你不想调整导航架构,给另外两个Fragment的事务也添加回退栈即可:
@Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); FragmentManager fragmentManager = this.getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); switch (id) { case R.id.action_settings: Fragment fragmentS = new SettingsFragment(); fragmentTransaction.replace(R.id.nav_host_fragment_content_main, fragmentS); fragmentTransaction.setReorderingAllowed(true); fragmentTransaction.addToBackStack(null); break; case R.id.action_kyc: Fragment fragmentK = new KnowYourCapacity_Fragment(); fragmentTransaction.replace(R.id.nav_host_fragment_content_main, fragmentK); fragmentTransaction.setReorderingAllowed(true); fragmentTransaction.addToBackStack(null); // 新增回退栈添加逻辑 break; case R.id.action_about: Fragment fragmentA = new HelpFragment(); Bundle bundle = new Bundle(); bundle.putString("help_desc", getResources().getString(R.string.pBasics_desc)); bundle.putString("help_image","basic"); fragmentA.setArguments(bundle); fragmentTransaction.replace(R.id.nav_host_fragment_content_main, fragmentA); fragmentTransaction.setReorderingAllowed(true); fragmentTransaction.addToBackStack(null); // 新增回退栈添加逻辑 break; default: break; } fragmentTransaction.commit(); return super.onOptionsItemSelected(item); }
内容的提问来源于stack exchange,提问作者BMG
相关产品推荐
相关产品推荐

