読者です 読者をやめる 読者になる 読者になる

なら@はてなブログ

福岡で働くスマートフォンエンジニア(おっさん)のブログ。更新頻度がとにかく低いのが悩み。

ダイアログ表示中の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。