onKeyDown()問題
-
13-09-2019 - |
質問
私は、写真/ビデオキャプチャアプリケーションを作成したいと思います。
私は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
の文のスコープ内の真のリターンを移動し、の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ドキュメントを見ている中で際立っている唯一のものは、Androidがいることです。
あなたはこれを試すことができます。
this.setFocusable(true);
あなたの活動は、キーイベントを食べることができます。活動にonKeyDownメソッドをオーバーライドし、そこにブレークポイントを投げます。
また:あなたが言うとき、あなたはXMLレイアウトを使用するか、あなたのコードでやっている「メインフォームでそれを置く」しました。
?