常時表示するアプリをAndroidで作った時にこまったこと

仕事で常時全面に表示するAndroidアプリをつくったときに、大変だったので、これは共有せねば!とおもいました。

0、まずはどうやって全面表示するんだっけ

この部分は結構サンプルが多いので、飛ばし気味で。
前面表示されるビューの作り方 | Android-Noteを参考にしました。

難しそうな常時全面表示の処理が意外とすんなりできて、楽しい。
しかし、凝ったことをしようとすると色々と問題が。

1、edittextをおしてもキーボードが反応しない、、

画面上にedittextを配置してタップすると、フォーカスは移るのですが、キーボードが出てきません。原因は参考にしたサイトのWindowManager.LayoutParamsにありました。

    WindowManager.LayoutParams params 
        = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            0, 80,
            WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
            PixelFormat.TRANSLUCENT);

6番目の設定項目のFLAGが、FLAG_NOT_FOCUSABLEだと、フォーカスを取得できないために、キーボードが表示できないようでした。

    WindowManager.LayoutParams params 
        = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            0, 80,
            WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
            WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
            PixelFormat.TRANSLUCENT);

このようにFLAGをFLAG_NOT_TOUCH_MODALに書き換えたところ、edittextにフォーカスが当たった瞬間キーボードが表示されました。

2、確認画面のOKが押せなくなった、、

上記対応で実装していると、今度は確認画面が押せなくなってしまいました。具体的には「アプリケーションの選択」ができなくなっていました。

ネットを検索していると
Androidの表示レイヤーと画面常駐型アプリの話
を発見。そうか、パラメータを動的に切り替えればいいのか。

ということで、edittextが活性になる瞬間でFLAG_NOT_TOUCH_MODALを、それ以外の場合ではFLAG_NOT_FOCUSABLEに切り替えるようにしました。

3、ListViewよお前もか、、

お次は、ListViewのonItemClickイベントが発生しない。

ネット上で解決方法を探しても、「カスタムビューの中にフォーカス可能なものを、フォーカス非活性にするといいよ」というものばかり。見つけた情報に従って、フォーカスを非活性にしても、なかなかonItemClickが発生しません。

これはもしかして、edittextと同じ、フロート画面側のフォーカスの問題ではないか?と思い、FLAG_NOT_TOUCH_MODALに変更してみると、、、動かない。

あ、そうだ、フォーカスを非活性にしたままだった。全部デフォルト状態にすると、、、、動いた!

最後に

プログラムというよりも、フラグとの戦いで疲れました。同じ状況の人の参考になれば嬉しいです。