метода OnKeyDown (вопрос)
Я хотел бы создать приложение для захвата фото/видео.
Я создал CaptureView
класс, который расширяется SurfaceView
и разместил его в основной форме.
деятельность основной формы имеет onCreateOptionsMenu()
метод, который создает меню. Меню работало нормально, но затем я попытался реализовать метод onKeyDown
:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(event.getAction() == KeyEvent.ACTION_DOWN) {
switch(keyCode) {
case KeyEvent.KEYCODE_CAMERA:
videoPreview.TakePicture();
return true;
}
}
return super.onKeyDown(keyCode, event);
}
меню больше не появляется, и метод не ловит событие onKeyDown.
кто-нибудь знает, что может быть причиной этот вопрос?
8 ответов
я обнаружил, что возвращаюсь true
для всех событий, где я должен был только возвращать его для кода, который я использовал. Я переместил return true в область if
заявление и вернул false
в противном случае это вернуло мое меню!
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
super.onKeyDown(keyCode, event);
if (keyCode == KeyEvent.KEYCODE_BACK) {
dba.close();
Intent result = new Intent("Complete");
setResult(Activity.RESULT_OK, result);
finish();
return true;
}
return false;
}
У меня была аналогичная проблема и я решил ее, добавив
this.requestFocus();
this.setFocusableInTouchMode(true);
в конструкторе моего подкласса SurfaceView.
Я решил удалить оператор if, например:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch(keyCode)
{
case KeyEvent.KEYCODE_CAMERA:
videoPreview.TakePicture();
return true;
}
return super.onKeyDown(keyCode, event);
}
Я не знаю, почему иногда это не работает, хотя для одного из моих приложений это keyDown()
работает нормально, и снова, когда я использую его на другое приложение, то он не работает.
но у меня есть решение, которое всегда работает:
@Override
public boolean dispatchKeyEvent (KeyEvent event) {
if (event.getAction()==KeyEvent.ACTION_DOWN && event.getKeyCode()==KeyEvent.KEYCODE_BACK) {
Toast.makeText(this, "Back button pressed", Toast.LENGTH_LONG).show();
return true;
}
return false;
}
я решил это, добавив в конструктор этот код:
setFocusable(true);
requestFocus();
спасибо, Ciryon
и каждый раз, когда я использую setContentView(myView);
нужно позвонить myView.requestFocus();
. Если есть лучшее решение, Пожалуйста, скажите мне.
Ну, глядя на документацию API, единственное, что выделяется, - это то, что атрибут android:clickable должен быть установлен, а также включен вид для onKeyDown(...) метод работы.
ваша деятельность может быть едят ключевое событие. Переопределите onKeyDown в действии и введите точку останова.
также: Когда вы говорите, что" разместили его в основной форме", вы используете макет XML или делаете в своем коде?