Вопрос

Я хотел бы создать приложение для захвата фото/видео.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top