处理Android6.0中popuoWindow的兼容性
2016-11-22 本文已影响154人
信马归风
前记
popupWindow
是Android开发中很重要的一个控件。具体的使用方式我就不多提了。但是popupWindow
在Android6.0之后是有些许修改的,这些修改导致我在开发中遇到了很大的坑。在此提出来,希望大家能够规避。
变更
在Android6.0之前popupwindow如果设置
popupWindow.setOutsideTouchable(true);
popupWindow.setFocusable(false)
那么点击屏幕外部是不会导致popupWindow
触发dismiss()
事件的。而在Android6.0下则会触发。
问题
一般情况下我们使用popupWindow如下图
popupWindow
点击全部类型弹出搜索框,再次点击关闭搜索框。
popButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (popupWindow.isShowing()) {
popupWindow.dismiss();
} else {
popupWindow.showAsDropDown(popButton);
}
}
});
这部分的代码在Android6.0以下的机子会正常,但是在Android6.0以上会出现,在popupWindow
弹出后,点击“全部类型”并不能正常关闭popupWindow
,而是popupWindow
关闭后再次打开。
这是因为再次点击“全部类型”首先会使popupWindow.dismiss()
如此导致你在回调中popupWindow.isShowing()
判断为false再次打开了popupWindow
解决办法
其实很简单,只要拦截popupWindow的touch事件即可.由我自自己根据情况来处理popupWindow
的开关事件
popupWindow.setTouchInterceptor(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
return true;
}
return false;
}
});