拦截返回按钮

24

我正在编写一个应用程序,它将有两个活动,当用户在第二个活动上按下返回按钮时,应该弹出一个对话框询问用户确认该操作。那么我该如何拦截?我对此表示怀疑,因为后退栈是操作系统本身的一部分。有人找到了解决方法吗?


认真考虑一下这件事。这是非标准的Android行为,可能会让你的用户感到烦恼。你是想避免他们丢失未保存的数据吗? - I82Much
4个回答

54

在一个活动中,你可以覆盖重写

onBackPressed()

编辑:这是API级别5+的要求。对于4及以下的版本,你需要覆盖重写onKeyDown()。


碎片怎么样? - Machado
当对话框片段位于活动之上时,将不会调用Activity onBackPressed函数。 - Krešimir Prcela
这已经被弃用了很久。你应该使用onBackPressedDispatcher - Peter Bruins

12

在您的活动中简单地覆盖 onKeyDown(int, KeyEvent) 方法并查找后退按钮。返回 true 以消耗此事件。

public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        //Do something here
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

+1,我以前做过这个,它绝对有效,尽管当我使用它时,那是在我理解多个活动的概念之前... - Chris Thompson
//在这里做一些事情(我试图为我的测试代码显示一个toast),但对我来说不起作用。当我按返回按钮时,什么也没有发生。 - Ragunath Jawahar
我的错误,我没有调用 Toast.show()。 代码运行正常。谢谢 @skorulis - Ragunath Jawahar

6

根据文档,如果可以的话,请不要使用 onBackPressed。现在推荐使用 onBackPressedDispatcher.addCallback(this) {}。这是一个片段示例:

class MyFragment : Fragment() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // This callback will only be called when MyFragment is at least Started.
        val callback = requireActivity().onBackPressedDispatcher.addCallback(this) {
            // Handle the back button event
        }

        // The callback can be enabled or disabled here or in the lambda
    }
    ...
}

5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接