Присоединение View.OnKeyListener к SurfaceView
Мне нужно прикрепить пользовательский сенсорный и аппаратный ключ к SurfaceView
, Мне нужно использовать отдельных слушателей (а не добавлять dispatchKeyEvent()
а также dispatchTouchEvent()
методы к SurfaceView
), так как я буду предоставлять пользовательские функции обработки событий третьей стороне для использования на их SurfaceView
и я хочу держать это отдельно.
Мой пользовательский сенсорный обработчик работает нормально, но ключевой обработчик событий не перехватывает никаких событий. Вот как я их устанавливаю:
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 ответ
По умолчанию SurfaceView не фокусируется, а затем не транслирует keyevent. Вам нужно активировать фокус:
setFocusable(true);
setFocusableInTouchMode(true);
requestFocus();
//And now you set your OnKeyEventListener
Имейте в виду, что, потеряв фокус для другого представления, он не получит никаких событий, пока не получит фокус снова.