onKeyDown() 问题
Posted
技术标签:
【中文标题】onKeyDown() 问题【英文标题】:onKeyDown() issue 【发布时间】:2010-11-01 18:14:36 【问题描述】:我想创建一个照片/视频捕捉应用程序。
我创建了一个扩展SurfaceView
的CaptureView
类并将其放在主窗体中。
主窗体的活动有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() 问题的主要内容,如果未能解决你的问题,请参考以下文章