PopupWindow学习

一.Android的对话框有两种:PopupWindow和AlertDialog

  • 两者的区别和联系

           本质区别为:AlertDialog是非阻塞式对话框:AlertDialog弹出时,后台还可以做事情;而PopupWindow是阻塞式对话框:PopupWindow弹出时,程序会等待,在PopupWindow退出前,程序一直等待,只有当我们调用了dismiss方法的后,PopupWindow退出,程序才会向下执行。这两种区别的表现是:AlertDialog弹出时,背景是黑色的,但是当我们点击背景,AlertDialog会消失,证明程序不仅响应AlertDialog的操作,还响应其他操作,其他程序没有被阻塞,这说明了AlertDialog是非阻塞式对话框;PopupWindow弹出时,背景没有什么变化,但是当我们点击背景的时候,程序没有响应,只允许我们操作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等),可以设置偏移或无偏移
  •  setContentView(popupconten);//重新设置PopupWindow的内容
  • pw.setFocusable(true);//默认是false,为false时,PopupWindow没有获得焦点能力,如果这是PopupWindow的内容中有EidtText,需要输入,这是是无法输入的;只有为true的时候,PopupWindow才具有获得焦点能力,EditText才是真正的EditText。
三.部分代码
 	View popView = inflater.inflate(R.layout.listview_pop, null);
        popupWindow = new PopupWindow(popView, LayoutParams.WRAP_CONTENT, 		  LayoutParams.WRAP_CONTENT);
	  //这句是为了防止弹出菜单获取焦点之后,点击activity的其他组件没有响应
        popupWindow.setBackgroundDrawable(new ColorDrawable(0));
        //设置popwindow出现和消失动画
        popupWindow.setAnimationStyle(R.style.PopMenuAnimation);
 	//设置popwindow显示位置
        popupWindow.showAtLocation(parent, 0, x, y);
        //获取popwindow焦点
        popupWindow.setFocusable(true);
        //设置popwindow如果点击外面区域,便关闭。
	//注意这里必须设置setBackgroundDrawable属性否则不能关闭
popupWindow.setOutsideTouchable(true);
	popupWindow.setOnDismissListener(){
		publuc void onDismiss(){
			//处理逻辑更改关闭状态
		}
	}
popupWindow.update();
四.Popwindow在7.0版本上的适配
当Popwindow的高度设置成MATCH_PARENET时,使用showAsDropDown()方法是Popwindow并没有显示在控件的下方,而显示在状态栏的下方,这个时候需要计算popwindow的高度,设置popwindow的实际高度后显示正常,代码如下:
	//需要计算PopupWindow的实际高度,屏幕高度减去PopupWindow以上的区域高度
	PopupWindow popupWindow = new PopupWindow(ViewGroup.LayoutParams.MATCH_PARENT,DeviceUtil.getScreenHeight(mContext)-title_layout.getHeight());
	//获取内容布局
	View contentView = LayoutInflater.from(mContext).inflate(R.layout.popwindow, null);
	//设置PopupWindow的布局
	popupWindow.setContentView(contentView);
	//设置内容以外区域的背景颜色为黑色半透明
	popupWindow.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#80000000")));
	//设置点击PopupWindow以外的区域关闭PopupWindow
	popupWindow.setOutsideTouchable(true);
	//设置PopupWindow显示在title_layout布局的下方
	popupWindow.showAsDropDown(title_layout);
	//设置点击PopupWindow除开内容布局之外的区域关闭PopupWindow
	contentView.setOnClickListener(new View.OnClickListener() {
		@Override
		public void onClick(View v) {
			popupWindow.dismiss();
		}
	});


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
嗨!对于你关于 Android PopupWindow 的问题,我可以给你一些基本的信息。PopupWindow 是 Android 中的一个弹出窗口,它可以覆盖在其他视图之上,提供一种临时性的用户界面。你可以使用 PopupWindow 来显示额外的内容、菜单或者交互提示。 要创建一个 PopupWindow,首先你需要实例化一个 PopupWindow 对象,并为其设置一些基本属性,例如宽度、高度、背景等。然后,你可以将任何视图或布局添加到 PopupWindow 中,并通过设置位置参数来控制它的显示位置。 下面是一个简单的示例代码,展示如何创建和显示一个 PopupWindow: ```java // 创建一个 PopupWindow 对象 PopupWindow popupWindow = new PopupWindow(context); // 设置 PopupWindow 的宽度和高度 popupWindow.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT); popupWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT); // 设置 PopupWindow 的内容视图 View contentView = LayoutInflater.from(context).inflate(R.layout.popup_layout, null); popupWindow.setContentView(contentView); // 设置 PopupWindow 的背景 popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); // 显示 PopupWindow popupWindow.showAtLocation(anchorView, Gravity.CENTER, 0, 0); ``` 在上面的示例中,我们创建了一个 PopupWindow 对象,并设置了宽度和高度为包裹内容。然后,我们通过调用 `setContentView` 方法将一个自定义的布局文件 `R.layout.popup_layout` 添加到 PopupWindow 中。最后,我们使用 `showAtLocation` 方法将 PopupWindow 显示在屏幕中央。 希望这些信息对你有帮助!如果你对 PopupWindow 有更多的问题,或者需要更详细的示例代码,请随时告诉我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值