写真/ビデオキャプチャアプリケーションを作成したいと思います。
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
を返していたことがわかりました。ここでは、使用していたコードに対してのみ返す必要がありました。 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;
}
私は同様の問題を抱えていて、追加することでそれを解決しました
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);
}
なぜ時々機能しないのかわかりませんが、私のアプリの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;
}
私はコンストラクターにこのコードを追加することでこれを解決しました:
_setFocusable(true);
requestFocus();
_
ありがとう、 Ciryon
また、setContentView(myView);
を使用するたびに、myView.requestFocus();
を呼び出す必要があります。より良い解決策があれば教えてください。
APIドキュメントを見ると、onKeyDown(...)メソッドが機能するためには、Android:clickable属性を設定し、ビューを有効にする必要があることが唯一の点です。
あなたはこれを試すことができます
this.setFocusable(true);
あなたの活動は重要なイベントを食べている可能性があります。アクティビティのonKeyDownをオーバーライドし、そこにブレークポイントをスローします。
また、「メインフォームに配置した」と言うとき、XMLレイアウトを使用していますか、それともコードで実行していますか?