Присоединение 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

Имейте в виду, что, потеряв фокус для другого представления, он не получит никаких событий, пока не получит фокус снова.

Другие вопросы по тегам