Android中为PopupWindow设置半透明背景的方案(兼容华为手机)

本文详细介绍了在Android中为PopupWindow设置半透明背景的方法,特别针对华为手机的兼容性问题提供了额外的解决方案。通过调整窗口属性并设置FLAG_DIM_BEHIND标志位,实现了在华为手机上有效显示半透明效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文地址:https://blog.youkuaiyun.com/biaobiao1217/article/details/51438552

 android中为PopupWindow设置半透明背景已经是老生常谈的问题了,网上一搜答案也都基本相同,最简单的就是获取窗体的属性,给其设置透明度:

/**
	 * 设置页面的透明度
	 * @param bgAlpha 1表示不透明
	 */
	public static void setBackgroundAlpha(Activity activity, float bgAlpha) {
		WindowManager.LayoutParams lp = activity.getWindow().getAttributes();
		lp.alpha = bgAlpha;
		activity.getWindow().setAttributes(lp);
	}


    此方法在绝大多数手机上都是有效的,但是如果你碰到的是华为手机,那么不好意思,只设置这几行代码是无效的(暂未找到原因)。其实要想兼容华为手机也很简单,只需要多加几行代码就行了:

/**
	 * 设置页面的透明度
	 * @param bgAlpha 1表示不透明
	 */
	public static void setBackgroundAlpha(Activity activity, float bgAlpha) {
		WindowManager.LayoutParams lp = activity.getWindow().getAttributes();
		lp.alpha = bgAlpha;
		if (bgAlpha == 1) {
			activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);//不移除该Flag的话,在有视频的页面上的视频会出现黑屏的bug
		} else {
			activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);//此行代码主要是解决在华为手机上半透明效果无效的bug
		}
		activity.getWindow().setAttributes(lp);
	}


当然,对窗体设置了透明度之后一定要记得在PopupWindow消失的时候将透明度设置回来:


		public void onDismiss() {
			if (activity != null) {
				setBackgroundAlpha(activity, 1f);
			}
		}


popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
			@Override
			public void onDismiss() {
				if (activity != null) {
					setBackgroundAlpha(activity, 1f);
				}
			}
		});


    当然,还有其他方法可以实现半透明效果,比如,设置PopupWindow为全屏,自己添加半透明的背景等,但是针对网上说的如下设置:
 

ColorDrawable dw = new ColorDrawable(-00000);
popupWindow.setBackgroundDrawable(dw);

单从编译角度来说,我就没有编译过去,不知道他们是怎样实现的。
PS:是不是应该改成:

ColorDrawable dw = new ColorDrawable(
getResources().getColor(R.color.black));
popupWindow.setBackgroundDrawable(dw);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值