Androidのソフトキーボードが閉じたかどうか検出 [日記]
Androidのソフトキーボードが閉じたかどうかを検出するのが一苦労なのです。
まずAndroidのソフトキーボードが閉じたかどうかを検出するAPIやイベントはありません。
この時点でクソです。
んでグーグルで調べてみると、LinearLayoutを継承してソフトキーボードが出入りした際に発生するonMesureイベントを利用する方法が紹介されています。
しかしこの方法、どうやらSurfaceView(OpenGLなど)を使用している場合などには使えないようで、実際使えませんでした。
この情報を知るまでに結構時間かかりました…
他のViewが必要に応じて押し上げられたりしてHeightが全然変化しないんですよね。
Resizeに設定すると、今度はSurfaceViewの画面が縮小してしまったりして。
たぶんこの状態ならHeightが変わるのかもしれませんが、そもそも画面全体が縮小しては利用が出来ないので試す前に諦めてしまいました。
で、どうしたかというと、まずEditTextを継承しonKeyPreImeをオーバーライドして、バックボタン(物理ボタン)の検出を行い、バックボタンが押されたかどうかを検出します。
@Override
public boolean onKeyPreIme(int keyCode, KeyEvent event){
if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP){
// バックボタンが押された
}
return super.onKeyPreIme(keyCode, event);
}
ただしこの検出には弱点があり、変換中のバックボタンは変換中解除の機能になる場合もあり、実際にはソフトキーボードは閉じないケースがあるようです。
機種やバージョンによっても異なるようで、対応が難しいところですが、閉じぬなら閉じてやろうキーボードってことで、バックボタンが押された際に強制的に閉じてしまうのも手です。
そしてLandscapeモードで表示されるフルスクリーンモードのキーボードの場合、右側に完了ボタンがあり、これを押されるとキーボードが閉じます。
これを検知するには、
setOnEditorActionListener(new OnEditorActionListener() {
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_DONE || actionId == EditorInfo.IME_ACTION_NEXT) {
// 完了ボタンが押された
}
return false;
}
});
とすることで検出が可能です。
一応この2つでソフトキーボードが閉じるのを検出できるようになりました。
無理やり閉じてるという話もありますけど…
共通テーマ:パソコン・インターネット
コメント 0