13

写真/ビデオキャプチャアプリケーションを作成したいと思います。

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

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

4

8 に答える 8

14

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

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

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

于 2009-11-30T10:15:17.323 に答える
12

私はtrueすべてのイベントに対して戻ってきたことがわかりました。そこでは、使用していたコードに対してのみそれを返す必要がありました。ifステートメントのスコープ内でreturntrueを移動し、falseそれ以外の場合はreturnを実行しました。これにより、メニューが元に戻りました。

@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;
}
于 2009-09-13T14:02:08.537 に答える
6

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

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    switch(keyCode)
    {
        case KeyEvent.KEYCODE_CAMERA:
            videoPreview.TakePicture();
            return true;
    }
    return super.onKeyDown(keyCode, event);
}
于 2010-06-15T14:42:40.570 に答える
4

なぜ時々機能しないのかわかりませんが、私のアプリの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;
}
于 2012-06-15T08:15:51.273 に答える
2

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

setFocusable(true);
requestFocus();

ありがとう、Ciryon

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

于 2012-02-14T14:18:39.173 に答える
1

APIドキュメントを見ると、onKeyDown(...)メソッドが機能するためには、android:clickable属性が設定されている必要があり、ビューが有効になっている必要があります。

于 2009-06-10T17:47:45.563 に答える
1

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

this.setFocusable(true);
于 2010-03-23T12:31:55.647 に答える
0

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

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

于 2009-06-10T19:41:46.533 に答える