WebViewのソフトキーボードにはまった
いま開発してるAndroidアプリでWebViewのテキストBOXをタップするとキーボードがでるんだけど、文字を確定させて「実行」とやってもキーボードが消えない問題があった。いちいちBACKボタンで消す必要がある。
これは不便なので、「実行」ボタンのタップを検知してJava側のコードでキーボードを消そうとしてハマったので、その記録を書いておく。
当初はWebViewにsetOnKeyListenerというメソッドがあるので、これを使えば楽勝! と思っていたが、ハンドラが呼ばれない。ではWebViewを拡張してonKeyDownをoverride! とやったがこれもダメ。
WebView.onKeyDownのリファレンスを注意深く読むとソフトウェアキーボードには効かないよと書いてあった(涙)。
StackOverflowなどを徘徊してdispatchKeyEventを実装する方法などを試してみたが、キー検知はできるものの日本語が入力できなかったりとうまくいかない。
結局、その他の試行錯誤もことごとく失敗し、半日程度を費やして失意のうちに帰宅。
翌日、InputConnectionWrapperを使えばうまくいけそうという情報をつかんでトライし、ようやく実現できた。
InputConnectionWrapperはキー入力のプロキシ的に動作するラッパクラスで以下のように使う。
まずはWebViewのラッパを作り、利用側で「実行」キーがタップされた時のコールバックを用意してそれを登録するという流れ。
わかれば簡単なのだけど、はまると時間喰うなぁ。。。