将View.OnKeyListener附加到SurfaceView

时间:2014-01-27 13:00:49

标签: android listener surfaceview

我需要将自定义触摸和硬件密钥处理附加到SurfaceView。我需要使用单独的侦听器(而不是将dispatchKeyEvent()dispatchTouchEvent()方法添加到SurfaceView),因为我将向第三方提供自定义事件处理功能以在其上使用SurfaceView,我希望将其分开。

我的自定义 touch 事件处理程序运行正常,但事件处理程序不会捕获任何事件。以下是我设置它们的方法:

public MyGLSurfaceView(Context c, AttributeSet a) {
    // Other setup...
    setOnTouchListener(new MyTouchListener()); // Works
    setOnKeyListener(new MyKeyListener()); // No events captured

}

这是我的主要听众:

public class MyKeyListener implements View.OnKeyListener {
    @Override
    public boolean onKey(View v, int key, KeyEvent e) {
        System.out.println("A hardware key was pressed!");
        return true;
    }
}

我是否应该将键侦听器附加到SurfaceView以外的其他对象?该视图位于Dialog内,因此我可以将我的关键侦听器附加到其中吗?

1 个答案:

答案 0 :(得分:1)

默认情况下,SurfaceView不可聚焦,然后不广播keyevent。 你需要激活焦点:

setFocusable(true);
setFocusableInTouchMode(true);
requestFocus();
//And now you set your OnKeyEventListener

请注意,通过忽略另一个视图的焦点,此视图在再次获得焦点之前不会接收任何事件。