情景如下:
 
    点击一个按钮后,弹出一个设置电台频率的PopupWindow的窗口,当点击PopupWindow之外的区域时,PopupWindow会消失,并将设置的信息进行保存,我在代码中监听了OnDismissListener事件,在里面做了保存操作。    现在的问题是,当点击窗口之外的区域或按返回键,都会进入OnDismissListener事件中,这样的话,我按返回键时也做了保存操作,不知道如何将这两者区别一下,达到点击区域外保存数据,按返回键不做任何操作的效果。
    

解决方案 »

  1.   

    没人理我...凄凉了啊~~~提出的问题已经解决了,下面说一下解决方法吧:昨天找了很多资料都没解决,于是今天就去找了一下PopupWindow的源码看,代码不是很多,就研究了一下,最后找到了两者操作的代码:源码地址:http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/1.5_r4/android/widget/PopupWindow.java#PopupWindow.dismiss%28%29按返回键取消PopupWindow的代码如下:1248        @Override
    1249        public boolean dispatchKeyEvent(KeyEvent event) {
    1250            if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
    1251                dismiss();
    1252                return true;
    1253            } else {
    1254                return super.dispatchKeyEvent(event);
    1255            }
    1256        }
    点击区域外取消PopupWindow的代码如下:@Override
    1267        public boolean onTouchEvent(MotionEvent event) {
    1268            final int x = (int) event.getX();
    1269            final int y = (int) event.getY();
    1270            
    1271            if ((event.getAction() == MotionEvent.ACTION_DOWN)
    1272                    && ((x < 0) || (x >= getWidth()) || (y < 0) || (y >= getHeight()))) {
    1273                dismiss();
    1274                return true;
    1275            } else if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
    1276                dismiss();
    1277                return true;
    1278            } else {
    1279                return super.onTouchEvent(event);
    1280            }
    1281        }
    由上面的代码可以看出,都调用了dismiss()方法。既然找了问题所在就好办了,于是修改源码,满足自己的需求,就这样 the question is resolve!
      

  2.   

    判断popwindow是否是null,不是null的时候,按返回键dissmiss就可以了
      

  3.   


    问题就是我需要监听 OnDismissListener 的事件做数据保存的操作,如下:popupWindow.setOnDismissListener(new OnDismissListener(){
    @Override
    public void onDismiss() {
    //此处保存数据
    }
         });
    按返回键时调用 popupWindow.dismiss() 方法时也会进入上面 OnDismissListener 的事件监听中保存数据,是不合理的
      

  4.   

    加一个boolean变量,if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
    如果是点back键导致popupWindow消失的将变量置为true,在OnDismissListener中判断变量为true就不保存数据。
      

  5.   

    目前是这样解决的,在接口中加了一个flag参数,按返回键调用dismiss(0),点区域外调用dismiss(1),代码如下:
            @Override
            public boolean dispatchKeyEvent(KeyEvent event) {
                if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
                    dismiss(0);
                    return true;
                } else {
                    return super.dispatchKeyEvent(event);
                }
            }        @Override
            public boolean onTouchEvent(MotionEvent event) {
                final int x = (int) event.getX();
                final int y = (int) event.getY();
                
                if ((event.getAction() == MotionEvent.ACTION_DOWN)
                        && ((x < 0) || (x >= getWidth()) || (y < 0) || (y >= getHeight()))) {
                    dismiss(1);
                    return true;
                } else if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
                    dismiss(1);
                    return true;
                } else {
                    return super.onTouchEvent(event);
                }
            }
    原来的dismiss()方法如下:    public void dismiss() {
            if (isShowing() && mPopupView != null) {
                unregisterForScrollChanged();            mWindowManager.removeView(mPopupView);
                if (mPopupView != mContentView && mPopupView instanceof ViewGroup) {
                    ((ViewGroup) mPopupView).removeView(mContentView);
                }
                mPopupView = null;
                mIsShowing = false;            if (mOnDismissListener != null) {
                    mOnDismissListener.onDismiss();
                }
            }
        }
    修改后:    public void dismiss(int flag) {
            if (isShowing() && mPopupView != null) {
                unregisterForScrollChanged();            mWindowManager.removeView(mPopupView);
                if (mPopupView != mContentView && mPopupView instanceof ViewGroup) {
                    ((ViewGroup) mPopupView).removeView(mContentView);
                }
                mPopupView = null;
                mIsShowing = false;            if (mOnDismissListener != null) {
                    mOnDismissListener.onDismiss(flag);
                }
            }
        }
    加上这个flag值后,在PopupWindow监听OnDismissListener时就可以根据flag来做处理:    addFMPopupWindow.setOnDismissListener(new OnDismissListener() {

            public void onDismiss(int flag) {
        if(flag == 1){   //点击区域外
                 //保存数据
        }
            }
        });