5

onKeyDown の基本アクティビティで単純なオーバーライドを行うと、Enter キーと Dpad の中央ボタン以外のすべてのキーの押下をキャプチャできます (ブレークポイントで決定)。理由はわかりません-誰かが状況に光を当てることができますか?

編集: クイック アップデート - Dpad センターをキャプチャし、キーの長押しを入力しますが、通常のプレスではありません。

4

3 に答える 3

12

この質問はすでにかなり古いことを知っていますが、絶望的なコーダーが迷子になった場合に備えて、回答を投稿します。

USBキーボードにも同様の問題がありました。EditText ボックス以外がフォーカスされている場合、ENTER キーは onKeyUp または onKeyDown によって捕捉されませんでした。

dispatchKeyEvent() を使用すると、ウィンドウに到達する前に KeyEvent を取得できます。私の場合、間違いなく ENTER キーを取得します。ただし、注意してください。イベントは 2 回呼び出されます。1 回はキー ダウン、もう 1 回はキー アップです。

ここにサンプルコード:

@Override
public boolean dispatchKeyEvent(KeyEvent event) {

    System.out.println(event.getAction() + " " + event.getKeyCode() + " - " + (char) event.getUnicodeChar());

    return true;
}
于 2015-07-26T08:27:07.897 に答える
1

ドキュメントを読みましたか?

ソフトウェア キーボードでキーを押しても、通常はこのリスナーはトリガーされませんが、状況によってはそうすることが選択される場合もあります。ソフトウェアキーの押下をキャッチするためにこれに依存しないでください。

また、キーをキャプチャする方法は非常にあいまいです。次を使用して送信されたkeyCodeをチェックしていません。

@Override public boolean onKeyDown(int keyCode, KeyEvent event) { return false; }

ビューから onKey を処理できます。

public boolean onKey(View v, int keyCode, KeyEvent event) {
    switch (keyCode) {
        case KeyEvent.KEYCODE_ENTER:
            /* This is a sample for handling the Enter button */
            return true;
    }
    return false;
}

OnKeyListener を実装し、リスナーを設定することを忘れないでください

viewname.setOnKeyListener(this);
于 2012-07-20T17:22:45.323 に答える