web-dev-qa-db-ja.com

Android-キーボードのキーを押す

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

私はこれを試しました:

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

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

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

4)InputMethodManagerオブジェクトの場合showSoftInputメソッドを呼び出して、ビューに渡します。これはキーボードを上げるためにも機能しません。実際、toggleSoftInputを呼び出さなければなりません。また、主要なイベントをキャッチしません。

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

26
Bemipefe

ハードウェアキーとバックキーを処理するには、ActivitydispatchKeyEvent(KeyEvent event) を使用できます。

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

[〜#〜] upd [〜#〜]:残念ながら、ソフトキーボードイベントを処理することはできません( 単一キーイベントの処理を参照 )、独自のカスタムキーボードを開発しない限り(リンクをたどって 入力メソッドの作成 )を確認してください。

38
vasart

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

これはworking codeです:

@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文字でのみ動作します。

14
Bemipefe

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

詳細については、 キーボード操作の処理

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

3
phnmnn

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

0
Danish