我想创建一个照片/视频捕获应用程序。
我创建了一个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事件。
有谁知道这个问题可能是什么原因?
答案 0 :(得分:14)
我有类似的问题并通过添加
解决了这个问题this.requestFocus();
this.setFocusableInTouchMode(true);
在我的SurfaceView子类的构造函数中。
答案 1 :(得分:12)
我发现我正在为所有事件返回 true
,我应该只为我正在使用的代码返回它。我在 if
语句的范围内移动了返回true,并返回 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;
}
答案 2 :(得分:6)
我解决了删除if语句的问题,如下所示:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch(keyCode)
{
case KeyEvent.KEYCODE_CAMERA:
videoPreview.TakePicture();
return true;
}
return super.onKeyDown(keyCode, event);
}
答案 3 :(得分: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;
}
答案 4 :(得分:2)
我通过在构造函数中添加以下代码来解决这个问题:
setFocusable(true);
requestFocus();
谢谢,Ciryon
每次我使用setContentView(myView);
时,我都必须致电myView.requestFocus();
。如果有更好的解决方案,请告诉我。
答案 5 :(得分:1)
好吧,在查看API文档时,唯一突出的是必须设置android:clickable属性以及为onKeyDown(...)方法启用的视图。
答案 6 :(得分:1)
你可以试试这个
this.setFocusable(true);
答案 7 :(得分:0)
您的活动可能正在吃关键事件。覆盖活动中的onKeyDown并在那里抛出一个断点。
另外:当你说你“把它放在主窗体中”时你是在使用XML布局还是在你的代码中做?