Android使用FragmentContainerView时Up按钮点击关闭应用而非返回上一Fragment
问题原因
你当前遇到的Toolbar Up按钮行为异常,是因为没有在Activity中重写onSupportNavigateUp()方法。该方法负责接管顶部Up按钮的点击导航逻辑,未重写时Up按钮不会触发Navigation组件的回退栈处理逻辑,会直接执行Activity的默认返回行为,最终导致应用被关闭。
解决方案
只需要对HomeActivity代码做两处修改即可解决问题:
- 将
navController从onCreate的局部变量提升为全局类成员变量,方便重写方法时调用 - 重写
onSupportNavigateUp()方法,将Up按钮的处理逻辑交给Navigation组件
修改后的完整HomeActivity代码如下:
class HomeActivity : AppCompatActivity() { private lateinit var binding: ActivityHomeBinding private val viewModel: HomeActivityViewModel by viewModels() // 提升为类成员变量 private lateinit var navController: NavController override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityHomeBinding.inflate(layoutInflater) setContentView(binding.root) setSupportActionBar(binding.homeToolbar) val navView: BottomNavigationView = binding.navView val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment_activity_home) as NavHostFragment // 赋值给类成员变量 navController = navHostFragment.navController // Passing each menu ID as a set of Ids because each // menu should be considered as top level destinations. val appBarConfiguration = AppBarConfiguration( setOf( R.id.navigation_home, R.id.navigation_fragment_a, R.id.navigation_notifications ) ) setupActionBarWithNavController(navController, appBarConfiguration) navView.setupWithNavController(navController) } // 重写Up按钮处理逻辑 override fun onSupportNavigateUp(): Boolean { return navController.navigateUp() || super.onSupportNavigateUp() } }
效果验证
修改完成后重新运行应用:
- 从Fragment A跳转到Fragment B后点击Up按钮,会正常回退到Fragment A
- 当回退到
AppBarConfiguration中配置的顶级目的地时,Up按钮会自动隐藏,符合官方导航设计规范 - 系统返回键的原有行为不受任何影响
内容的提问来源于stack exchange,提问作者blow
相关产品推荐
相关产品推荐

