Android开发会用到各种类型的弹框,我现在常用的就是MaterialDialog和Dialog,但有些时候Dialog不能满足项目的需求,这时候用PopupWindow效果会更好些。
1、初始化PopupWindow对象
private PopupWindow mPopupWindow;
/**
* 初始化popupWindow
*/
private void initPopuptWindow() {
View pop_view = View.inflate(getActivity(), R.layout.dialog_loan_type, null);
pop_view.findViewById(R.id.linear_out).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mPopupWindow.dismiss();
}
});
mPopupWindow = new PopupWindow(pop_view, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
mPopupWindow.setFocusable(true);//设置pw中的控件能够获取焦点
ColorDrawable dw = new ColorDrawable(0xb0000000);
mPopupWindow.setBackgroundDrawable(dw);//设置mPopupWindow背景颜色或图片,这里设置半透明
mPopupWindow.setOutsideTouchable(true); //设置可以通过点击mPopupWindow外部关闭mPopupWindow
mPopupWindow.setAnimationStyle(R.style.PopupAnimationAmount);//设置mPopupWindow的进出动画
mPopupWindow.update();//刷新mPopupWindow
mPopupWindow.showAsDropDown(mLinearMenu, 0, 0);//mPopupWindow显示的位置
/**
* PopupWindow消失监听方法
*/
mPopupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
@Override
public void onDismiss() {
}
});
}
2、使用PopupWindow
@OnClick({R.id.relative_amount, R.id.relative_lable})
public void onClick(View view) {
switch (view.getId()) {
case R.id.relative_amount:
getPopupWindow();
break;
case R.id.relative_lable:
getPopupWindow();
break;
}
}
private void getPopupWindow() {
if (null != mPopupWindow && mPopupWindow.isShowing()) {
mPopupWindow.dismiss();
return;
} else {
initPopuptWindow();
}
}
最终效果图:
7.0以上版本显示位置适配问题:
使用showAsDropDown()显示位置在7.0以上版本无效,这里给出的解决办法是在7.0以上的版本使用showAtLocation()的方法显示位置
@Override
public void showAsDropDown(View anchor) {
if (Build.VERSION.SDK_INT >= 24){
Rect rect = new Rect();
anchor.getGlobalVisibleRect(rect);
int h = anchor.getResources().getDisplayMetrics().heightPixels - rect.bottom;
setHeight(h);
}
super.showAsDropDown(anchor);
}