2009-10-20 30 views
6

Lunar Landerサンプルに基づいて簡単なアンドロイドゲームを作成しましたが、キーイベントの処理に問題があります。アクティビティが開始されると、onKeyDownまたはonKeyUpが呼び出される唯一のキーは、dpadの上/下/左/右キーです。 menu、back、またはdpad_centerのいずれのキーもonKeyメソッドをトリガーしません。ただし、dpadの上/下/左/右ボタンのいずれかを押した後で、メニュー、戻る、またはdpad_centerキーを押すと、これらのメソッドがトリガされます。私は間違いや何が起こっているのかの兆候は見られません。onKeyDownはAndroidアプリでは必ずしも呼び出されません

フォーカスが間違っている可能性があります。アクティビティは画面のボタンから開始されるため、タッチスクリーンモードになる可能性があります。それが事実なら、バックボタンに触れて右のフォーカスモードに入ってはいけないので、私はイベントをキャッチできますか?

SDK-1.5r3のエミュレータを使用しています。私はまだ実際の電話でこれを試すことができませんでした。ここに私のonKeyDownがあります。ビューまたは活性におけるこのonKeyDownメソッドは

public boolean onKeyDown(int keyCode, KeyEvent msg) 
{ 
    Log.d(TAG, "onKeyDown: " + keyCode); 
    return super.onKeyDown(keyCode, msg); 
} 

おかげ

マット

答えて

24

ですか?

ビュー内でsetContentViewが呼び出され、そのビューにsetFocusable(true)が呼び出された場合、すべてのキーイベントはアクティビティをバイパスし、ビューにまっすぐ進みます。

一方、onKeyDownがビュー内にあり、アクティビティでsetContentViewを呼び出しておらず、ビューでsetFocusable(true)を呼び出していない場合、アクティビティはビューではなくキーイベントを取得します。

これらの特定の呼び出しを探してくださいが、私はあなたがそれが焦点の問題であることについて正しいと思います。

+6

これは、ビューにあった - しかし、これを確認しながら、私はsetFocusableInTouchModeが有効になっていないことに気付きました - で問題を修正することを追加します。 –

+0

ああ、冷たい。申し訳ありませんが、私は実際の問題を逃しましたが、私は助けることができてうれしいです。 – haseman

+1

私はこれをフラグメントで試しましたが、フォーカスの可能性をtrueに設定していても、私のビューのonKeyDown()は呼び出されません。 'searchView.setFocusable(true); searchView.setFocusableInTouchMode(true); '。残念ながら、アクティビティのonKeyDown()は呼び出されますが、バックキーには呼び出されません。 – faizal

6

アクティビティのonKeyDown/onKeyUpメソッドが必ずしも呼び出されるとは限りません。それらのdispatchKeyEventとは違って、常に起動されたアクティビティ。キーダウン/キーアップロジックをここに移動します。うまくいく。

@Override 
public boolean dispatchKeyEvent(KeyEvent event) { 
    if (event.getAction() == KeyEvent.ACTION_DOWN) { 
     // keydown logic 
     return true; 
    } 
    return false; 
} 
+1

投稿していただきありがとうございます。非常に役立ちます :) –

関連する問題