RT,这是android4.0及以下系统版本存在的一个bug,我原来的代码是(只写了真正影响该问题的代码,其他的对此不影响就不写了):
......
private PupopWindow window;
......
window = new PopupWindow(mContext);//此问题的关键之一
window.setContentView(layoutView);
window.setWidth(referView.getWidth());//用referView的宽度作为PopupWindow的宽度
window.setHeight(LinearLayout.LayoutParams.WRAP_CONTENT);
window.setBackgroundDrawable(getResources().getDrawable(R.drawable.spinner_bg_pop));//此问题的关键之二
window.setFocusable(true); //设置PopupWindow可获得焦点
window.setTouchable(true); //设置PopupWindow可触摸
window.setOutsideTouchable(true); //设置非PopupWindow区域可触摸
......
问题就出在我在初始化PopupWindow时使用的构造方法PopupWindow(Context context),然后再setContentView(View v)等其他PopupWindow的属性设置方法,
这个小问题困扰了老子两天,终于还是让我找到了这个问题所在,首先把上面的初始化PopupWindow的构造方法改为:
......
window = new PopupWindow(layoutView, referView.getWidth(),
LayoutParams.WRAP_CONTENT);
window.setBackgroundDrawable(null);
window.setFocusable(true); //设置PopupWindow可获得焦点
window.setTouchable(true); //设置PopupWindow可触摸
window.setOutsideTouchable(true); //设置非PopupWindow区域可触摸 现在此代码无效
.......
这一个三参数的构造方法后,然后再把设置背景的那句代码注掉,或者改为window.setBackgroundDrawable(null),问题立刻解决;
但是上面这样做又带来了一个新的问题,就是在触摸PopupWindow外的其他地方的时候,无法隐藏PopupWindow,解决这个问题的方法是,重写PopupWindow的contentView的onTouchListener方法如下(此处是从别的地方看到的http://www.oschina.net/question/195012_69287):
final View contentView = getContentView(); //设置触摸事件 contentView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, 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(); return true; } else if (event.getAction() == MotionEvent.ACTION_OUTSIDE) { dismiss(); return true; } else { return contentView.onTouchEvent(event); } } });
这样的话问题算是真正解决了,即解决了点击PopupWindow中的控件背景变透明的问题,也解决了设置PopupWindow的背景为空时,setOutSideTouchable(true)无效的问题;
补充一句,android4.1上修复了这个bug!