onKeyDown() 问题

Posted

技术标签:

【中文标题】onKeyDown() 问题【英文标题】:onKeyDown() issue 【发布时间】:2010-11-01 18:14:36 【问题描述】:

我想创建一个照片/视频捕捉应用程序。

我创建了一个扩展SurfaceViewCaptureView 类并将其放在主窗体中。

主窗体的活动有onCreateOptionsMenu() 方法创建一个菜单。菜单运行良好,但后来我尝试实现一个方法onKeyDown

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) 

    if(event.getAction() == KeyEvent.ACTION_DOWN) 
        switch(keyCode) 
        case KeyEvent.KEYCODE_CAMERA:
            videoPreview.TakePicture();
            return true;
        
    

    return super.onKeyDown(keyCode, event);

菜单不再出现,方法也没有捕捉到 onKeyDown 事件。

有谁知道这个问题的原因是什么?

【问题讨论】:

如果注释掉if语句是不是还没有显示菜单? 我试图注释掉 if 语句,但正如预期的那样,没有任何改变。 我刚刚发现有一些异常与上述停止执行的代码无关。 【参考方案1】:

我有类似的问题,并通过添加解决了它

this.requestFocus();
this.setFocusableInTouchMode(true);

在我的 SurfaceView 子类的构造函数中。

【讨论】:

谢谢,这对我有用。我正在使用 viewflipper 在视图之间移动,并希望覆盖后退按钮以将视图设置为当前视图。向 VF 添加 webview 会停止触发 onKeyDown。在 VF 上设置 requestFocus 和 setFocusableInTouchMode 就可以解决了。再次感谢【参考方案2】:

我发现我为所有事件返回了 true,而我应该只为我正在使用的代码返回它。我将 return true 移到 if 语句的范围内并返回 false 否则这让我的菜单又回来了!

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) 
    super.onKeyDown(keyCode, event);
    if (keyCode == KeyEvent.KEYCODE_BACK) 
        dba.close();
        Intent result = new Intent("Complete");
        setResult(Activity.RESULT_OK, result);
        finish();
        return true;
    
    return false;

【讨论】:

抱歉总是返回 false 用于在旧版 SDK 中工作但会导致麻烦:使用 ICS 编译时,此方法将禁用后退键。当然,在您的特定情况下,它正在工作,因为您正在精确地消耗关键事件,但通常它不会按预期工作。 -1。最好的答案是'return super.onKeyDown(keyCode, event);',而不是当你不处理按键时总是返回 false,正如 rrabio 所发布的那样。 按下硬件搜索按钮时根本不会调用 onKeyDown() 方法,而是触发搜索默认行为。但是按返回或菜单按钮会触发此方法。怎么听安卓硬件搜索按钮的点击?【参考方案3】:

我解决了删除 if 语句的问题,如下所示:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) 
    switch(keyCode)
    
        case KeyEvent.KEYCODE_CAMERA:
            videoPreview.TakePicture();
            return true;
    
    return super.onKeyDown(keyCode, event);

【讨论】:

是的,好点。最后总是返回 false 曾经对我有用,但是在使用新的 ICS SDK 进行编译时,后退键不再起作用,因为现在似乎在 super.onKeyDown 中消耗了该事件【参考方案4】:

我不知道为什么有时它不起作用,尽管对于我的一个应用程序,keyDown() 工作正常,但当我将它用于新应用程序时它又不起作用。

但我有一个始终有效的解决方案:

@Override
public boolean dispatchKeyEvent (KeyEvent event) 
    if (event.getAction()==KeyEvent.ACTION_DOWN && event.getKeyCode()==KeyEvent.KEYCODE_BACK) 
        Toast.makeText(this, "Back button pressed", Toast.LENGTH_LONG).show();
        return true;
    
    return false;

【讨论】:

【参考方案5】:

我通过在构造函数中添加以下代码解决了这个问题:

setFocusable(true);
requestFocus();

谢谢,Ciryon

而且每次我使用setContentView(myView); 时,我都必须调用myView.requestFocus();。如果有更好的解决方案请告诉我。

【讨论】:

【参考方案6】:

好吧,在查看 API 文档时,唯一突出的一点是必须设置 android:clickable 属性以及启用 onKeyDown(...) 方法的视图。

【讨论】:

【参考方案7】:

你可以试试这个

this.setFocusable(true);

【讨论】:

【参考方案8】:

您的 Activity 可能正在吃关键事件。覆盖 Activity 中的 onKeyDown 并在其中设置断点。

另外:当你说你“把它放在主窗体中”时,你是在使用 XML 布局还是在你的代码中做?

【讨论】:

以上是关于onKeyDown() 问题的主要内容,如果未能解决你的问题,请参考以下文章

onkeydown事件不触发了,怎么办

按键响应onKeyDown,onKeyLongPress,onKeyUp

OnKeyPress OnKeyDown区别

onKeyDown 和 onKeyLongPress

Sencha touch 中的 onkeydown

对非输入元素反应 onKeyDown/onKeyUp 事件