キー入力の取得処理でハマってる
今日はキー入力の取得処理でハマって、全く進んでない。
まず、EditTextなしでキーボードを表示してキーイベントを取得する方法で考えた。
AndroidManifest.xml で<activity>の属性にandroid:windowSoftInputMode="stateAlwaysVisible" を追加すればキーボードは常時表示される。
ActivityのonKeyDown(int keyCode, KeyEvent event)
をオーバーライドすれば押されたキーのボタン番号とKeyEventが取得できる。
のだが、ここで戻りがStringとかCharのメソッドを調べて、
「ボタンに対応する文字を取得する機能が存在しない。」と判断してしまった。
次にEditTextなしは諦めてEditTextの変更をTextWatcherで監視する方法を試みた。
普通にEditTextを使うと確定前に表示されちゃうので、TextWatcherで確定判別。
確定時にイベントが発生すれば良いのだが、そういうイベントはない模様。
この場合はソフトキーボードの強制表示は、
showSoftInput()の第1引数がViewだが、Viewなしでキーボード表示は動的にできないのかな?
で、TextWatcherでの確定判別だが、
なのだが、キーボードをゆっくり押すと問題ないが、速く押すと未確定のはずが一瞬確定してる。
他に、未確定状態だとアンダーラインがついているはず!ということでSpannedでアンダーラインを判別しても似たようなことが出来るようなのだが、
キーボードを押すと一瞬アンダーラインが消えてるのが目視できる。結局同じぽい。
どうしたもんかと思ったが、
実は最初に試したActivityのonKeyDown()の方で、
戻り値がint型なので気づかなかったが、event.getUnicodeChar()でボタンに対応するchar値(intで返ってくるが)が取得できた。
isPrintingKey()で表示可能文字かどうかの判別もできるんで、
表示可能ならそのまま送信して、表示できない文字は個別に処理作れば良さそう。
というわけで、ActivityのonKeyDown()でキー入力を取得する方法で行こうと思うが、1byteずつ送ることになるんで、
マルチバイト文字の入力が必要な場合とかは入力エリア使ってやるしか無いかな。
まず、EditTextなしでキーボードを表示してキーイベントを取得する方法で考えた。
AndroidManifest.xml で<activity>の属性にandroid:windowSoftInputMode="stateAlwaysVisible" を追加すればキーボードは常時表示される。
ActivityのonKeyDown(int keyCode, KeyEvent event)
をオーバーライドすれば押されたキーのボタン番号とKeyEventが取得できる。
のだが、ここで戻りがStringとかCharのメソッドを調べて、
「ボタンに対応する文字を取得する機能が存在しない。」と判断してしまった。
次にEditTextなしは諦めてEditTextの変更をTextWatcherで監視する方法を試みた。
普通にEditTextを使うと確定前に表示されちゃうので、TextWatcherで確定判別。
確定時にイベントが発生すれば良いのだが、そういうイベントはない模様。
この場合はソフトキーボードの強制表示は、
InputMethodManager imm=(InputMethodManager)getSystemService(this.INPUT_METHOD_SERVICE);
imm.showSoftInput(view,imm.SHOW_IMPLICIT);
てな感じでできる。imm.showSoftInput(view,imm.SHOW_IMPLICIT);
showSoftInput()の第1引数がViewだが、Viewなしでキーボード表示は動的にできないのかな?
で、TextWatcherでの確定判別だが、
public void afterTextChanged(Editable s){
for(Object obj:s.getSpans(0,s.length(),Object.class)){
if((s.getSpanFlags(obj)&s.SPAN_COMPOSING)==s.SPAN_COMPOSING){
Log.d("TES","未確定"+s.toString());
return;
}
}
Log.d("TES","確定"+s.toString());
}
こんな感じで、Spanned(Editableがimplementsしてる)のフラッグを確認すると、未確定状態だとSPAN_COMPOSINGが付いているようなので、それを判別。for(Object obj:s.getSpans(0,s.length(),Object.class)){
if((s.getSpanFlags(obj)&s.SPAN_COMPOSING)==s.SPAN_COMPOSING){
Log.d("TES","未確定"+s.toString());
return;
}
}
Log.d("TES","確定"+s.toString());
}
なのだが、キーボードをゆっくり押すと問題ないが、速く押すと未確定のはずが一瞬確定してる。
他に、未確定状態だとアンダーラインがついているはず!ということでSpannedでアンダーラインを判別しても似たようなことが出来るようなのだが、
キーボードを押すと一瞬アンダーラインが消えてるのが目視できる。結局同じぽい。
どうしたもんかと思ったが、
実は最初に試したActivityのonKeyDown()の方で、
戻り値がint型なので気づかなかったが、event.getUnicodeChar()でボタンに対応するchar値(intで返ってくるが)が取得できた。
isPrintingKey()で表示可能文字かどうかの判別もできるんで、
表示可能ならそのまま送信して、表示できない文字は個別に処理作れば良さそう。
というわけで、ActivityのonKeyDown()でキー入力を取得する方法で行こうと思うが、1byteずつ送ることになるんで、
マルチバイト文字の入力が必要な場合とかは入力エリア使ってやるしか無いかな。