2014-01-27 2 views
0

Мне нужно прикрепить пользовательскую обработку сенсорного и аппаратного ключа к SurfaceView. Мне нужно использовать отдельные прослушиватели (вместо того, чтобы добавлять dispatchKeyEvent() иметоды к SurfaceView), так как я буду предоставлять функции обработки пользовательских событий третьей стороне для использования на своих SurfaceView, и я хочу сохранить ее отдельно.Прикрепление View.OnKeyListener к 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 

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

+0

Отлично, спасибо! –

Смежные вопросы