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);
}
Меню больше не отображается, и метод не блокирует событиеKeyDown.
Кто-нибудь знает, в чем причина этой проблемы?
Ответы
Ответ 1
Я обнаружил, что возвращаю 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;
}
Ответ 2
У меня была аналогичная проблема и она была решена путем добавления
this.requestFocus();
this.setFocusableInTouchMode(true);
в конструкторе моего подкласса SurfaceView.
Ответ 3
Я решил удалить инструкцию if, например:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch(keyCode)
{
case KeyEvent.KEYCODE_CAMERA:
videoPreview.TakePicture();
return true;
}
return super.onKeyDown(keyCode, event);
}
Ответ 4
Я не знаю, почему иногда это не работает, хотя для одного из моих приложений этот 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;
}
Ответ 5
Я решил это, добавив в конструктор этот код:
setFocusable(true);
requestFocus();
спасибо, Ciryon
Также каждый раз, когда я использую setContentView(myView);
, я должен вызвать myView.requestFocus();
. Если есть лучшее решение, скажите мне.
Ответ 6
Хорошо, глядя на документацию по API, единственное, что выделяется, это то, что должен быть установлен атрибут android: clickable, а также возможность просмотра для метода onKeyDown (...).
Ответ 7
вы можете попробовать это
this.setFocusable(true);
Ответ 8
В вашей деятельности может быть ключевое событие. Переопределите onKeyDown в действии и бросьте там точку останова.
Также: когда вы говорите, что вы "поместили его в основную форму", используете ли вы макет XML или делаете в своем коде?