2014年5月27日火曜日

Android の PopupWindow が dismiss できない備忘録

久しぶりです。
Android 開発、難しいですね。
知ってました?Android の PopupWindow 作るの難しいの。

Problems creating a Popup Window in Android Activity
タイミングが速すぎるんですよ。何このノウハウ?
でね、PopupWindow 破棄するのも、難しいの知ってました?

PopupWindow.dismiss() なんですがね、PopupWindow.isShowing() == true じゃないと、破棄できないんですよ。迅速にUIでポップアップの表示と破棄をボタン連打で繰り返してると、ゴーストウィンドウが溜まりまくるんですよwwww

何が起きてるかっていうと、PopupWindow が表示しきれる前に破棄をUIから指示できるんです。
そうすると

PopupWindow.isShowing() == false 時に破棄関数が呼ばれて、dismiss() できないから、PopupWindow のインスタンスは生きたまま破棄できない状態でスルーですわ。

どうすればいいか?

  private void purgePopup( PopupWindow pw ) {
    if( pw == null ) return;
    if( pw.isShowing() ) {
      pw.dismiss();
    } else {
      final PopupWindow oldWindow = pw;
      new Timer().schedule(new TimerTask(){
        @Override
        public void run() {
          getActivity().runOnUiThread(new Runnable(){
            public void run() {
              oldWindow.dismiss();
            }
          });
        }
      }, 100);
    }
  }
こんな感じで対処したら、うまくいきました。ぼぇー