常時表示するアプリを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に変更してみると、、、動かない。
あ、そうだ、フォーカスを非活性にしたままだった。全部デフォルト状態にすると、、、、動いた!
最後に
プログラムというよりも、フラグとの戦いで疲れました。同じ状況の人の参考になれば嬉しいです。