关于Android4.0及以下系统版本使用PopupWindow.dismiss()时内部的Drawable透明的问题

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!

你可能感兴趣的:(android,bug,PopupWindow)