ダイアログ表示中のsearchキー
ほひー。こんな更新頻度でblogと呼んでいいんじゃろか?
というわけで、例によって久々の更新でございます。
タイトルそんまんまです。
Androidではいろいろダイアログ使うと思います。エラーダイアログとかは普通に表示させるだけなんでアレですが、YES/NOのついた確認ダイアログとかで、必ずダイアログで準備したボタンのリスナー処理を走らせたい場合はよくありますね。
あとは、非同期処理中に表示させるProgressDialogなんかも、途中でダイアログ消されると困る場合が多いです。
そういった場合、通常は
Dialog.setCancelable(false)
を設定することで、ダイアログ表示をキャンセルさせない設定ができます。
ただ、これはあくまで端末のbackキーを無効にするだけで、端末のsearchキーを押された場合はダイアログが消えてしまいます。
困りました。
で、その対応としては、普通にsearchキーのイベントを無視すればいいんですが、ダイアログの表示中は呼び出し元のActivityではなく、前面に出ているダイアログがイベントを拾うので、実装場所の注意が必要です。
具体的には、表示するDialog自身がキーイベントを拾って無効にする、という処理を書く必要があります。
実装例
Dialog dialog = new Dialog(this); dialog.setCancelable(false); dialog.setOnKeyListener(new DialogInterface.OnKeyListener() { @override public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { // searchキーの場合はイベントを消化したことにして返す if (keyCode == KeyEvent.KEYCODE_SEARCH) { return true; } // それ以外はイベント未消化で返す return false; } }); // 以下、ダイアログ構築の処理を続ける
って感じですか。
サンプルはしかさんに作ってもらったんですがw。