ソフトキーボードの任意のキーを押してキャッチしたい。アクティビティにEditViewまたはTextViewが必要ないため、イベントはアクティビティ内の拡張ビューから処理する必要があります。
私はこれを試しました:
1)onKeyUp(int keyCode, KeyEvent event)
Activityメソッドをオーバーライドします。これはソフトキーボードでは機能せず、ハードキーボードをほとんどキャッチしません。
2)OnKeyListener
を作成し、登録済みの作業中のOnTouchListener
を含むビューに登録します。これはソフトキーボードではまったく機能しません。
3)onKeyUp(int keyCode, KeyEvent event)
Viewメソッドをオーバーライドします。 OnKeyListenerを設定した場合も設定しなかった場合も、これはまったく機能しません。
4)InputMethodManager
オブジェクトの場合showSoftInput
メソッドを呼び出して、ビューに渡します。これはキーボードを上げるためにも機能しません。実際、toggleSoftInput
を呼び出さなければなりません。また、主要なイベントをキャッチしません。
すべてエミュレーターでのみテストしましたが、それで十分だと思います。なぜそんなに複雑なのか、キーボードから簡単なキーイベントを取得しますか?
ハードウェアキーとバックキーを処理するには、Activity
で dispatchKeyEvent(KeyEvent event)
を使用できます。
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
Log.i("key pressed", String.valueOf(event.getKeyCode()));
return super.dispatchKeyEvent(event);
}
[〜#〜] upd [〜#〜]:残念ながら、ソフトキーボードイベントを処理することはできません( 単一キーイベントの処理を参照 )、独自のカスタムキーボードを開発しない限り(リンクをたどって 入力メソッドの作成 )を確認してください。
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文字でのみ動作します。
ハードウェアキーボードからのみソフトキーボード(スクリーンキーボード)のキープレスイベントを処理するオプションはありません。
詳細については、 キーボード操作の処理
注:KeyEventクラスおよび関連APIでキーボードイベントを処理する場合、そのようなキーボードイベントはハードウェアキーボードからのみ発生することを想定する必要があります。ソフト入力メソッド(スクリーンキーボード)のキーのキーイベントの受信に依存しないでください。
キーボードがアクティビティで開かれると、アクティビティは実際にフォアグラウンドになります...すべてのTextAreaまたはTextFieldsには、onScreenキーボードからキーを押す独自のメカニズムがあります...アクティビティAndroid:windowSoftInputMode = "stateAlwaysVisible"の下にファイルを作成すると、onkeyDown()が機能します。