web-dev-qa-db-ja.com

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イベントをキャッチしません。

この問題の原因が何であるかを誰かが知っていますか?

13
Niko Gamulin

すべてのイベントでtrueを返していたことがわかりました。ここでは、使用していたコードに対してのみ返す必要がありました。 ifステートメントのスコープ内でreturn trueを移動し、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;
}
12
Neil Kirk

私は同様の問題を抱えていて、追加することでそれを解決しました

this.requestFocus();
this.setFocusableInTouchMode(true);

私のSurfaceViewサブクラスのコンストラクターで。

14
Ciryon

私は次のようにifステートメントを削除することを解決しました:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    switch(keyCode)
    {
        case KeyEvent.KEYCODE_CAMERA:
            videoPreview.TakePicture();
            return true;
    }
    return super.onKeyDown(keyCode, event);
}
6
rrabio

なぜ時々機能しないのかわかりませんが、私のアプリの1つでは、この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;
}
4
enam

私はコンストラクターにこのコードを追加することでこれを解決しました:

_setFocusable(true);
requestFocus();
_

ありがとう、 Ciryon

また、setContentView(myView);を使用するたびに、myView.requestFocus();を呼び出す必要があります。より良い解決策があれば教えてください。

2
alaster

APIドキュメントを見ると、onKeyDown(...)メソッドが機能するためには、Android:clickable属性を設定し、ビューを有効にする必要があることが唯一の点です。

1
Dean

あなたはこれを試すことができます

this.setFocusable(true);
1
zhujian

あなたの活動は重要なイベントを食べている可能性があります。アクティビティのonKeyDownをオーバーライドし、そこにブレークポイントをスローします。

また、「メインフォームに配置した」と言うとき、XMLレイアウトを使用していますか、それともコードで実行していますか?

0
haseman