直接上代码,代码给注释。
private void showPopupWindow() {
View contentView = LayoutInflater.from(EarningsActivity.this).inflate(R.layout.view_popupwindow_earning, null);
mPopupWindow = new PopupWindow(contentView);
// 设置PopupWindow为包裹内容
mPopupWindow.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
mPopupWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
// 设置响应触摸事件,设置不聚焦
mPopupWindow.setTouchable(true);
mPopupWindow.setFocusable(false);
// setOutsideTouchable设置生效的前提是setTouchable(true)和setFocusable(false)
mPopupWindow.setOutsideTouchable(true);
TextView tv1 = (TextView) contentView.findViewById(R.id.pop_yesterday);
TextView tv2 = (TextView) contentView.findViewById(R.id.pop_a_week);
TextView tv3 = (TextView) contentView.findViewById(R.id.pop_a_month);
TextView tv4 = (TextView) contentView.findViewById(R.id.pop_three_month);
tv1.setOnClickListener(this);
tv2.setOnClickListener(this);
tv3.setOnClickListener(this);
tv4.setOnClickListener(this);
// 设置PopupWindow在某控件的下方
mPopupWindow.showAsDropDown(mLl_menu);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (mPopupWindow != null && mPopupWindow.isShowing()) {
mPopupWindow.dismiss();
}
return true;
}
在设置 PopupWindow 的时候,博主的手机(vivo 吐槽下这个手机的屁事真的多)一直出现一个问题,就是无论点击外部区域还是Back键都无法 dismiss 弹框,网上有说不设置背景就不能响应返回键和点击外部消失(这个博主没有自己尝试过,因为在之前就已经在布局设置好了背景颜色,如果还没有设置背景颜色导致无法响应事件的小伙伴就赶快设置背景颜色吧),最后再设置Activity的onTouchEvent(),就可以成功的点击外部区域 dismiss PopupWindow了。
有的小伙伴可能不知道PopupWindow可以设置在View的下面,也可以设置在View的上面,当我们使用.showAsDropDown();这个方法时候,不妨点进去看一下源码,在这个方法下面还有两个重载的方法,只是传递的参数不同。我们可以用到下面两个的任意一个
showAsDropDown(View anchor, int xoff, int yoff);
orshowAsDropDown(View anchor, int xoff, int yoff, int gravity);可以实现对位置进行设置。