onKeyDown()问题

时间:2009-06-10 10:02:41

标签: android android-view onkeydown

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

我创建了一个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事件。

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

8 个答案:

答案 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布局还是在你的代码中做?