Android导航组件ActionBar向上/父事件处理

Posted

技术标签:

【中文标题】Android导航组件ActionBar向上/父事件处理【英文标题】:Android Navigation Component ActionBar Up/Parent event handling 【发布时间】:2021-04-13 20:07:21 【问题描述】:

所以我在我的应用程序中使用 android Navigation,我遇到了这种情况:

我有 2 个片段 A -> B,现在每当用户从 B -> A 导航回来时,我想在返回事件之前显示警报。

我已经关注this 的回答,得到了这个解决方案:

// code on fragment B's onViewCreated()
requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner) 
    alert("Are you sure to quit?")

当我按下硬件后退按钮时,此解决方案运行良好,但是当我按下工具栏上的后退按钮时,不会调用回调。请帮帮我,谢谢。

这是我的 MainActivity 的导航设置:

override fun onCreate(savedInstanceState: Bundle?) 
    super.onCreate(savedInstanceState)
    supportActionBar!!.setDisplayHomeAsUpEnabled(true)

    navController = findNavController(R.id.nav_host_fragment_container)
    appBarConfiguration = AppBarConfiguration(navController.graph)
    setupActionBarWithNavController(navController, appBarConfiguration)


override fun onSupportNavigateUp(): Boolean 
    return navController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp()


override fun onOptionsItemSelected(item: MenuItem): Boolean 
    return item.onNavDestinationSelected(navController) || super.onOptionsItemSelected(item)

【问题讨论】:

这是向上按钮,而不是返回按钮。这些是不同的东西。 【参考方案1】:

onCreateView 的片段 B 中启用选项菜单

setHasOptionsMenu(true)

并覆盖onOptionsItemSelected

override fun onOptionsItemSelected(item: MenuItem): Boolean 
    if (item.itemId == android.R.id.home)  // ActionBar back/parent button is pressed
        // onBackPressed() // to return back to Fragment A
    
    return true

【讨论】:

【参考方案2】:

你需要添加如下代码-

override fun onSupportNavigateUp(): Boolean 
    alert("Are you sure to quit?")
    return false

【讨论】:

以上是关于Android导航组件ActionBar向上/父事件处理的主要内容,如果未能解决你的问题,请参考以下文章

AndroidUI组件之ActionBar--基于下拉的导航方式

android-ActionBar

从活动向上导航到片段打开相同的片段 - Android 导航组件

Android导航组件“向上按钮”打开抽屉导航

Android: Action Bar的使用

Android界面编程--使用活动条(ActionBar)--实现Tab导航