我需要将自定义触摸和硬件密钥处理附加到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
内,因此我可以将我的关键侦听器附加到其中吗?
答案 0 :(得分:1)
默认情况下,SurfaceView不可聚焦,然后不广播keyevent。 你需要激活焦点:
setFocusable(true);
setFocusableInTouchMode(true);
requestFocus();
//And now you set your OnKeyEventListener
请注意,通过忽略另一个视图的焦点,此视图在再次获得焦点之前不会接收任何事件。