Android onKeyDown()问题
我想创建一个照片/视频捕获应用程序 我创建了一个Android onKeyDown()问题,android,android-view,onkeydown,Android,Android View,Onkeydown,我想创建一个照片/视频捕获应用程序 我创建了一个CaptureView类,该类扩展了SurfaceView,并将其放在主窗体中 主窗体的活动具有创建菜单的onCreateOptionsMenu()方法。菜单工作正常,但随后我尝试实现一种方法onKeyDown: @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(event.getAction() == KeyEvent.ACTION_DOWN) {
CaptureView
类,该类扩展了SurfaceView
,并将其放在主窗体中
主窗体的活动具有创建菜单的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事件
有人知道这个问题的原因吗?好吧,在查看API文档时,唯一突出的是必须设置android:clickable属性以及启用视图,以便onKeyDown(…)方法工作。您的活动可能正在吞噬关键事件。在活动中重写onKeyDown并在其中抛出断点
另外:当您说您已经“将其放置在主窗体中”时,您是在使用XML布局还是在代码中执行操作?我发现我正在为所有事件返回
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;
}
我有一个类似的问题,通过添加
this.requestFocus();
this.setFocusableInTouchMode(true);
在我的SurfaceView子类的构造函数中。你可以试试这个
this.setFocusable(true);
我解决了删除if语句的问题,如下所示:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch(keyCode)
{
case KeyEvent.KEYCODE_CAMERA:
videoPreview.TakePicture();
return true;
}
return super.onKeyDown(keyCode, event);
}
我通过在构造函数中添加以下代码来解决此问题:
setFocusable(true);
requestFocus();
谢谢
而且每次我使用
setContentView(myView)代码>我必须调用myView.requestFocus()代码>。如果有更好的解决方案,请告诉我。我不知道为什么有时它不起作用,但对于我的一个应用程序,这个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;
}
如果您注释掉If语句,菜单是否仍然未显示?我尝试注释掉If语句,但正如预期的那样,没有任何更改。我刚刚发现有一些与停止执行上述代码无关的异常。谢谢,这对我很有效。我使用viewflipper在视图之间移动,并希望覆盖“后退”按钮以将视图设置为当前视图。向VF添加webview时,onKeyDown停止触发。在VF上设置requestFocus和setFocusableInTouchMode可以解决问题。再次谢谢你说得好。始终在末尾返回false对我来说很有用,但是当使用新的ICS SDK编译时,back键不再起作用,因为该事件现在似乎已在super.onKeyDownSorry始终返回false用于在旧SDK中工作,但会导致问题:当使用ICS编译时,此方法将禁用back键。当然,在您的具体情况下,它可以正常工作,因为您正在精确地使用back key事件,但通常情况下,它不会按预期工作。最好的答案是“返回super.onKeyDown(keyCode,event);”,不像rrabio发布的那样,当您不处理按键按下时总是返回false。当按下硬件搜索按钮时,根本不会调用onKeyDown()方法,而是触发搜索默认行为。但按下后退或菜单按钮会触发此方法。我怎样才能听到android硬件搜索按钮的点击。?