Android:Fragment C的ActionBar返回按钮无法通过setDisplay方法隐藏,如何解决?
解决Fragment C隐藏ActionBar返回按钮的问题
问题出在Navigation Component的setupActionBarWithNavController会自动根据目的地和AppBarConfiguration控制返回按钮的显示状态——因为C不在顶级目的地列表里,每次跳转到C时,NavController都会强制显示返回按钮,导致你直接调用的setDisplayShowHomeEnabled()等方法被覆盖。
你可以通过监听NavController的目的地变化,动态修改ActionBar配置来解决:
修改你的MainActivity代码,添加目的地监听器:
class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) val navController = findNavController(R.id.navHostFragment) val appBarConfiguration = AppBarConfiguration( setOf(R.id.aFragment, R.id.bFragment) ) setupActionBarWithNavController(navController, appBarConfiguration) binding.navView.setupWithNavController(navController) // 添加目的地变化监听器 navController.addOnDestinationChangedListener { _, destination, _ -> when (destination.id) { // 进入CFragment时隐藏返回按钮 R.id.cFragment -> { supportActionBar?.apply { setDisplayHomeAsUpEnabled(false) setDisplayShowHomeEnabled(false) } } else -> { // 其他页面根据是否为顶级目的地恢复返回按钮状态 val isTopLevel = appBarConfiguration.isTopLevelDestination(destination) supportActionBar?.setDisplayHomeAsUpEnabled(!isTopLevel) } } } } }
如果想在CFragment内部处理,也可以在onResume中设置,但要注意NavController可能会重置状态,所以上面的监听方式更稳定:
class CFragment : Fragment() { override fun onResume() { super.onResume() (activity as AppCompatActivity).supportActionBar?.apply { setDisplayHomeAsUpEnabled(false) setDisplayShowHomeEnabled(false) } } // 离开时恢复状态,避免影响其他页面 override fun onPause() { super.onPause() val navController = findNavController() val appBarConfiguration = AppBarConfiguration(setOf(R.id.aFragment, R.id.bFragment)) val isTopLevel = appBarConfiguration.isTopLevelDestination(navController.currentDestination!!) (activity as AppCompatActivity).supportActionBar?.setDisplayHomeAsUpEnabled(!isTopLevel) } }
推荐使用第一种监听目的地的方式,逻辑更集中,也不容易出现状态不一致的问题。
内容的提问来源于stack exchange,提问作者shisushi
相关产品推荐
相关产品推荐

