2013年9月24日火曜日

Android PopupWindowをモーダルにする方法

よく忘れるのでメモ

------

PopupWindowsetOutsideTouchable() で true をセットすると、ポップアップウィンドウの外側をタッチした時に閉じるようになります。

ただし、これだけだと外側をタッチしたときのイベント自体は依然として下のビューに伝わるので、困った状態になることがあります。

例えば、ボタンをタップしたときにポップアップウィンドウを表示する場合を考えてみましょう。

ポップアップウィンドウが表示されている状態でボタンの部分をタップすると、指をつけた瞬間にポップアップウィンドウが閉じ、指を離したときに再度ポップアップウィンドウが表示される、という動作になってしまいます。

これを避けるには、ポップアップウィンドウをモーダルにします。
モーダルにすると、外側をタッチしたときのイベントが下のビューに伝わらなくなります。

ポップアップウィンドウをモーダルにするには setFocusable()で true をセットします。

setModal()という名前じゃないのでわかりにくいです。
ListPopupWindowには、setModal() が用意されており、内部ではまさしく setFocusable() を呼んでいます。

http://tools.oesf.biz/android-4.2.0_r1.0/xref/frameworks/base/core/java/android/widget/ListPopupWindow.java#260 260 public void setModal(boolean modal) { 261 mModal = true; 262 mPopup.setFocusable(modal); 263 }

Android 用の FlashAir ライブラリ作った

先日 FlashAir Developers 主催のハンズオンを担当させていただきました。

↓資料


ハンズオンの準備をするに当たって、ライブラリを作ったほうが良さそうだと思い、簡単なラッパーを作成しました。
jar にまとめるべきなんでしょうが、ハンズオンではライブラリプロジェクトとして使いました。

↓ライブラリ
FlashAirDev

主に command.cgi と thumbnail.cgi しか対応してないので、pull req 歓迎です。