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 или делаете в своем коде?