我们在很多时候都需要使用PopupWindow来提示消息,PopupWindow是一种非常常用的控件。在使用中要注意下:
第一,构造PopupWindow的时候,要选择合适的构造函数。不同的函数,得到的PopupWindow不同。例如,在下面的四个构造函数中
第一个构造函数设置了显示的view,但是,它却不可获得焦点并且他的尺寸为0;这就有时候出现一个这样的情况:我的代码完全正确,可PopupWindow却看不见,这里就是应为他的尺寸问题。
第二:焦点问题。PopupWindow弹出前,要设置他为可以获得焦点的。否则就会出现点击popupwindow没有反映。popupWindow.setFocusable(true);
第三:如何让它消失。在创建的时候设置他的背景Drawable。popupWindow.setDrawable(new Drawable());这样在单击其他空白区域的时候这个PopupWindow就会消失。
第四:如何控制破pUpWindow的大小,随便设置一个宽和高?关于这点,起初的时候,我在这里犯了一些错。
在之前的学习中,我直接用LayoutInflater来加载布局文件,来得到要显示的view,在用getMeasuredHeight()和getMeasuredWidth()来得到宽和高。得到的结果却是0.
出现这样的错误是对控件的绘制过程不理解。Android控件的绘制分为三大阶段:measure->layout->draw.只有在measure之后(measure函数会调用onMeasure,得到控件的宽和高)才可以调用上述方法来得到宽和高。以下是测量的方法:
int w = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);
int h = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);
opView.measure(w, h);
int height =opView.getMeasuredHeight();
int width =opView.getMeasuredWidth();
这样就可以得到宽和高。
还有更简单的方法:
构造的时候的参数
new PopupWindow(opView,ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT,false);
第二和第三个参数指定宽和高。最后一个指定是否可以获得焦点。
当然,上面的一些细节的设置都要在显示之前。一旦显示之后再来设置这些,就没用了。