PopupWindow这个类用来实现一个弹出框,可以使用任意布局的View作为其内容,这个弹出框是悬浮在当前activity之上的。
一般只有popView能直接设置显示位置,以某个控件为参照物,来进行显示。
// 每次显示之前,需要先隐藏一下;页面销毁时,也需要销毁;
private void dimissPopupWindow() {
if(popWindow!=null && popWindow.isShowing()){
popWindow.dismiss();
popWindow = null;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
// 隐藏并销毁popWindow
dimissPopupWindow();
}
private void showPopupWindow(View parent) {
dimissPopupWindow();
View view = getLayoutInflater().inflate(R.layout.dialog_alter_protocol, null);
TextView tv = (TextView) view.findViewById(R.id.tv);
tv.setText(protocol);
popWindow = new PopupWindow(view, width, height);
// popWindow = new PopupWindow(view, ViewGroup.LayoutParams.WRAP_CONTENT, -2);
popWindow.setFocusable(true);
// popWindow.setOutsideTouchable(true); // 这行代码其实没有一点用处
// 如果不设置PopupWindow的背景,无论是点击外部区域还是Back键都无法dismiss弹框
// 我觉得这里是API的一个bug
popWindow.setBackgroundDrawable(new ColorDrawable(0x00000000));
int[] location = new int[2];
parent.getLocationInWindow(location);
// 设置PopupWindow弹出窗体动画效果
// popWindow.setAnimationStyle(R.style.AnimationPreview);
popWindow.showAtLocation(parent, Gravity.LEFT+Gravity.TOP, location[0], location[1]);
}
Android的对话框有两种:PopupWindow和AlertDialog
它们的不同点在于:AlertDialog的位置固定,而PopupWindow的位置可以随意
AlertDialog是非阻塞线程的,AlertDialog弹出的时候,后台可是还可以做其他事情的哦。
而PopupWindow是阻塞线程的, 这就意味着在我们退出这个弹出框之前,程序会一直等待
PopupWindow的位置按照有无偏移分,可以分为偏移和无偏移两种;按照参照物的不同,可以分为相对于某个控件(Anchor锚)和相对于父控件。具体如下
showAsDropDown(View anchor):相对某个控件的位置(正左下方),无偏移
showAsDropDown(View anchor, int xoff, int yoff):相对某个控件的位置,有偏移
showAtLocation(View parent, int gravity, int x, int y):相对于父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以设置偏移或无偏移
弹出框在指定位置上的显示(不能使用Dialog,而是PopupWindow)
lp.x = 0;
lp.y = 0; // lp.x与lp.y表示相对于原始位置的偏移. 设置的宽高也有一些误差;
同样如果你将Dialog封装在一个实体里也正常使用。
this.setAnimationStyle(R.style.AnimationPreview);
// 我觉得这里是API的一个bug ---> (2017.8.11)没有设置,也没错啊~(保险一些,还是加上去吧)
popWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
popWindow.setFocusable(true); // 设置为可以获得焦点
方式二不用设置焦点、第二种方法,不用给它焦点。。
设置PopupWindow弹出窗体动画效果
<?xml version="1.0" encoding="utf-8"?>
<!-- 扩大-->
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromXScale="0.001"
android:toXScale="1.0"
android:fromYScale="0.001"
android:toYScale="1.0"
android:pivotX="100%"
android:pivotY="10%"
android:duration="200" />
http://blog.csdn.net/heng615975867/article/details/8891668 简单属性介绍