如何在自定义视图中检测返回键

6
我希望能在我的自定义视图(例如EditText)中检测返回键事件。通常情况下,可以通过重写onKeyDown()或dispatchKeyEvent()方法来实现,在这种情况下,我的自定义视图需要获得焦点。
CustomView.java
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if( keyCode == KeyEvent.KEYCODE_BACK) {
        ..... 
        return true;
    }else{
        return super.onKeyDown(keyCode, event);
    }
}

然而,如果一个包含CustomView的Activity也同时重写了onKeyDown()或dispatchKeyEvent()方法,它可能无法正常工作。也就是说,在CustomView之前,Activity已经获取了Back-KeyEvent。
我更希望在Activity之前捕获Back-KeyEvent。
请告诉我一些解决这个问题的想法。 谢谢。
3个回答

2

0

你可以尝试使用

setFocusableInTouchMode(true)
setFocusable(true)
requestFocus()

在你的自定义视图上


0
在您的Activity中重写onKeyDown方法,并返回false,这样事件也会传播到其他视图。

如果您处理了该事件,请返回true。如果您想允许下一个接收器处理该事件,请返回false。


2
这并不完全正确。在Activity中,当按下某个键且未被活动内任何视图处理时,将调用onKeyDown方法。首先会在焦点视图上调用onKeyDown,然后是在Activity上,最后才是在其他视图上。 - Michal Chudy
但是只要我们返回false,它就会传递给下一个接收器,对吧?尽管@MoshErsan的答案可能更适合这样做。但正如问题中所提到的,在Activity中已经重写了onKeyDown方法,所以不论如何都必须在该方法中返回false! :) - Vikram Singh
2
就像你所说的那样。在你的帮助下,我明白了方法调用的顺序。实际上,当我尝试时,它是View#onKeyPreImeActivity#dispatchKeyEventView#dispatchKeyEventView#onKeyDown,最后是Activity#onKeyDown。谢谢! - Gottie
@Gottie 没错!值得注意的是,如果您有多个视图(例如两个EditText),并且其中一个具有焦点,则检查会发生什么。 - Michal Chudy

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