31

ソフトキーボードの任意のキーの押下をキャッチしたい。アクティビティにEditViewまたはTextViewは必要ありません。イベントは、アクティビティ内の拡張ビューから処理する必要があります。

私はこれを試しました:

onKeyUp(int keyCode, KeyEvent event)1) Activityメソッドをオーバーライドします。これはソフトキーボードでは機能しません。ハードキーボードをほとんどキャッチしません。

2)自分を作成OnKeyListenerし、登録済みで動作中のを含むビューに登録しますOnTouchListener。これは、ソフトキーボードではまったく機能しません。

onKeyUp(int keyCode, KeyEvent event)3) Viewメソッドをオーバーライドします。OnKeyListenerを設定した場合も、設定しなかった場合も、これはまったく機能しません。

4)InputMethodManagerオブジェクトを使用してメソッドを呼び出しshowSoftInput、ビューを渡します。これはキーボードを上げるためにも機能しません、確かに私は呼び出す必要がありますtoggleSoftInput; また、重要なイベントをキャッチすることもできません。

私はすべてエミュレーターでのみテストしましたが、それで十分だと思います。キーボードから単純なキーイベントを取得するのがとても複雑なのはなぜですか?

4

4 に答える 4

41

ハードウェアキーとバックキーを処理するためdispatchKeyEvent(KeyEvent event)に、Activity

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

UPD:残念ながら、独自のカスタムキーボードを開発しない限り、ソフトキーボードイベントを処理することはできません(シングルキーイベントの処理を参照)(入力メソッドの作成方法については、リンクをたどってください)。

于 2012-06-30T18:52:53.090 に答える
17

vasartのヒントで 、KeyPressイベントを取得できます。キーコードを印刷可能にするために、関数getUnicodeCharを使用してメタボタンの状態を渡し、文字をキャストするだけで問題が解決します。

これは動作するコードです

@Override
public boolean dispatchKeyEvent(KeyEvent KEvent) 
{
    int keyaction = KEvent.getAction();

    if(keyaction == KeyEvent.ACTION_DOWN)
    {
        int keycode = KEvent.getKeyCode();
        int keyunicode = KEvent.getUnicodeChar(KEvent.getMetaState() );
        char character = (char) keyunicode;

        System.out.println("DEBUG MESSAGE KEY=" + character + " KEYCODE=" +  keycode);
    }


    return super.dispatchKeyEvent(KEvent);
}

もちろん、これはASCII文字でのみ機能します。

于 2012-07-05T16:50:50.737 に答える
4

ソフトキーボード(オンスクリーンキーボード)のキー押下イベントをハードウェアキーボードからのみ処理するオプションはありません。

詳細:キーボードアクションの処理

注:KeyEventクラスおよび関連するAPIを使用してキーボードイベントを処理する場合、そのようなキーボードイベントはハードウェアキーボードからのみ発生することを期待する必要があります。ソフト入力方式(オンスクリーンキーボード)のキーのキーイベントの受信に依存しないでください。

于 2017-02-20T14:00:51.837 に答える
2

キーボードがアクティビティで開かれると、アクティビティは実際にフォアグラウンドになります...すべてのTextAreaまたはTextFieldsには、onScreenキーボードからキーが押される独自のメカニズムがあります...仮想キーボードにonKeyDown()listnerを使用する場合は、AndroidManifestで設定してください。あなたのアクティビティandroid:windowSoftInputMode = "stateAlwaysVisible"の下にあるファイルを作成すると、onkeyDown()が機能します。

于 2015-11-04T13:23:59.727 に答える