проблема onKeyDown()
-
13-09-2019 - |
Вопрос
Я хотел бы создать приложение для захвата фото/видео.
Я создал 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.
Кто-нибудь знает, в чем может быть причина этой проблемы?
Решение
Я обнаружил, что возвращаюсь true
для всех событий, где мне следовало возвращать его только для того кода, который я использовал.Я переместил возвращаемое значение 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();
Спасибо, Кирион
Также каждый раз, когда я использую setContentView(myView);
я должен позвонить myView.requestFocus();
.Если есть лучшее решение, пожалуйста, скажите мне.
Что ж, при просмотре документации API единственное, что бросается в глаза, это то, что атрибут android:clickable должен быть установлен, а также включено представление, чтобы метод onKeyDown(...) работал.
ты можешь попробовать это
this.setFocusable(true);
Ваша активность может быть связана с ключевым событием.Переопределите onKeyDown в действии и добавьте туда точку останова.
Также:когда вы говорите, что «поместили это в основную форму», вы используете макет XML или делаете это в своем коде?