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();
}
}
最終效果圖:
qqqq.jpg
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);
}