情景如下:
点击一个按钮后,弹出一个设置电台频率的PopupWindow的窗口,当点击PopupWindow之外的区域时,PopupWindow会消失,并将设置的信息进行保存,我在代码中监听了OnDismissListener事件,在里面做了保存操作。 现在的问题是,当点击窗口之外的区域或按返回键,都会进入OnDismissListener事件中,这样的话,我按返回键时也做了保存操作,不知道如何将这两者区别一下,达到点击区域外保存数据,按返回键不做任何操作的效果。
点击一个按钮后,弹出一个设置电台频率的PopupWindow的窗口,当点击PopupWindow之外的区域时,PopupWindow会消失,并将设置的信息进行保存,我在代码中监听了OnDismissListener事件,在里面做了保存操作。 现在的问题是,当点击窗口之外的区域或按返回键,都会进入OnDismissListener事件中,这样的话,我按返回键时也做了保存操作,不知道如何将这两者区别一下,达到点击区域外保存数据,按返回键不做任何操作的效果。
解决方案 »
- 关于android单元测试的问题
- adb reboot后data/system/wallpaper_info.xml文件被改
- android蓝牙打印功能
- Android里面许多 CHECK_EQ 等操作是什么作用?
- android底部半透明个性化菜单功能如何实现
- mac下识别不了手机,adb命令用不了
- 如何让 ImageView 反显?
- 安卓客戶端ksoap2 webservice Xfire 數據交互
- No Activity found to handle Intent { act=android.settings.WIFI_SETTINGS }
- 求windows7 64位下安卓+eclipse开发平台搭建方法
- 小白问题
- [求助]GridView载入过慢问题
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!
问题就是我需要监听 OnDismissListener 的事件做数据保存的操作,如下:popupWindow.setOnDismissListener(new OnDismissListener(){
@Override
public void onDismiss() {
//此处保存数据
}
});
按返回键时调用 popupWindow.dismiss() 方法时也会进入上面 OnDismissListener 的事件监听中保存数据,是不合理的
如果是点back键导致popupWindow消失的将变量置为true,在OnDismissListener中判断变量为true就不保存数据。
@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){ //点击区域外
//保存数据
}
}
});