9

ユーザーがスペースバーを押したときにアクティビティを開始したい。スペース バーがクリックされたときにコードが検出されません。

@Override
public boolean dispatchKeyEvent(KeyEvent e) {
    if (e.getKeyCode() == KeyEvent.KEYCODE_SPACE) {
        Toast.makeText(MainActivity.this, "YOU CLICKED SPACE KEY",
                Toast.LENGTH_LONG).show();
        return true;
    }
    Toast.makeText(MainActivity.this, "Didnt work", Toast.LENGTH_SHORT)
            .show();
    return super.dispatchKeyEvent(e);
};

}

4

4 に答える 4

8

この回答に見られるように、リスナーを現在のフォーカスView を持つに設定するか、 で使用dispatchKeyEventすることができます。Activity

どちらも機能します。


コメントへの回答:私のリンクをたどったことがあるなら、おそらく今までに実装Activity.dispatchKeyEvent(KeyEvent)したことでしょう。:-)

コードは押したキーを登録しませんが、戻るキーを押すと「機能しませんでした」とトーストします

たまたまエミュレーターを使用していますか?最新の SDK ではエミュレータのキーボードに問題があるようです。特殊キー (DPAD、HOME、BACK など) は機能しますが、オンスクリーンの QWERTY キーボードはどのプレスも登録しません。私のラップトップの物理キーボードも、プレスを登録しません。

理由を聞かないでください。

そして、今週私はリンクに答えを投稿しましたが、それはうまく機能していたからです。変更点は今朝、Android SDK を R20/JB にアップデートしたことなので、その影響もあるかと思います。

ただし、実際のデバイスでのみ機能します。物理キーボードをタブレット (P7510 / Honeycomb 3.2) に接続したところ、スペースを押しても問題なくリッスンします。

まだ疑問がある場合は、ここに証拠があります: :-)

ここに画像の説明を入力

于 2012-07-01T04:50:46.377 に答える
2
public abstract boolean onKey (View v, int keyCode, KeyEvent event)

この関数を使用して、どのキーが押されたかを確認できます。

于 2012-08-05T11:01:18.707 に答える
1

コピー/貼り付けの回答で申し訳ありませんが、これで目的が達成されるはずです。

これは、ユーザーが「スペースバー」を押してスペースバーを離したときに発生します。彼らがそれを手放すのを待ちたくない場合は、ブール値を削除して、 onKeyDown 関数でコードを実行できます。お役に立てれば。

boolean spacePressed = false;
@Override
public boolean onKeyDown(View arg0, Editable arg1, int arg2, KeyEvent arg3) {
    // TODO Auto-generated method stub
       switch (keyCode) {
               case KeyEvent.KEYCODE_SPACE:
               {
                  spacePressed = true;
                  return true;
                }
               // other cases can go here
    }

    return true;
}// End of onKeyDown



@Override
public boolean onKeyUp(View arg0, Editable arg1, int arg2, KeyEvent arg3) {
   if (spacePressed){
       // start intent

       // make this false again, so other keys won't trigger it
       spacePressed = false;
   }

    return true;
}// End of onKeyUp
于 2012-08-02T12:51:28.473 に答える
1

この場合、私が行ったことは、オーバーライドされた関数「onKey」を使用したことです

@Override
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event)
{
    if (keyCode == nNeededKeyCode)
    {
        //do something
    }
    return true;
}

ps まず、「OnKeyListener()」を使用してキー押下イベントを取得する必要があります

于 2012-07-31T10:40:23.837 に答える