web-dev-qa-db-ja.com

Android:例を使用してKeyPressイベントを取得する方法?

ユーザーが任意のキーを押したときにキーの値を取得し、Androidで押されたキーに基づいてアクションを実行したい。

例えばユーザーが「A」キーを押した場合、その値を取得、比較、何かしたい。

14
Hiren Dabhi

この質問への回答は2つあるはずです。鍵の生成方法によって決まります。ハードウェアキーを押した場合は、以下の両方の方法が有効です。ソフトウェアキーを押した場合は、実際の状況によって異なります。

1.)キーが、メニューキーを長押しして得られたソフトキーボードを押した結果だった場合:

次の関数を慎重にオーバーライドする必要があります。

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) {

    switch (keyCode) {
        case KeyEvent.KEYCODE_A:
        {
            //your Action code
            return true;
        }
    }
    return super.onKeyDown(keyCode, event);
}

2.)アクティビティにEditTextが含まれ、そこからソフトキーボードが取得された場合、キーイベントがEditTextによってすでに消費されているため、最初のアプローチは機能しません。テキストを変更したリスナーを使用する必要があります:

mMyEditText.addTextChangedListener(new TextWatcher()
{
    public void afterTextChanged(Editable s) 
    {
    }
    public void beforeTextChanged(CharSequence s, int start, int count, int after) 
    {
        /*This method is called to notify you that, within s, the count characters beginning at start are about to be replaced by new text with length after. It is an error to attempt to make changes to s from this callback.*/ 
    }
    public void onTextChanged(CharSequence s, int start, int before, int count) 
    {
    }
);
22
Zelimir

Ssooのバージョンが2.3までの場合、Zelimirコードは機能します。このコードを2.3で実行している場合、まったく機能しません。すべてのssooバージョンでイベントキーを制御する方法は、dispatchKeyEvent()を使用することです。

@Override
    public boolean dispatchKeyEvent(KeyEvent event) {
        Log.d("hello", String.valueOf(event.getKeyCode()));
        return super.dispatchKeyEvent(event);
    }

これにより、Webビューで、またはどこにいても、押されたキーを制御できます。唯一のバグは、「アクションボタン」を制御できないことです...理由がわかりません。

6
jfcogato

これを試してみてください、これは完全にうまくいきます。

@Override
public boolean onKeyUp (int keyCode, KeyEvent event){
char c = (char) event.getUnicodeChar();
//Do something....
return super.onKeyUp(keyCode, event);
}
3
Mohammed Imran