PopupWindow显示NavigationBar又出现

本文深入探讨了解决PopupWindow在Android中显示NavigationBar的问题,通过分析PopupWindow的实现原理,提出了使用代理模式拦截WindowManager.addView方法的解决方案,有效避免了NavigationBar的意外显示。

 

由于业务需要将底部的NavigationBar给隐藏了,期间用不获取焦点的方式处理了dialog弹出navigationBar又会出现的问题,本以为万事ok了,谁曾想,换popupWindow弹出,navigationBar又出现了。

第一想法,按dialog的套路来处理,结果刚下手就发现,两实现方式不同,popupWindow是用windowManager来添加view的,不能用这个套路来玩。

那就换一种,获取到DecorView,去设置它的flags(网上基本上的解决方案都是用这种)

public static void setFullScreenWindowLayout(Window window, boolean withNavigationBar) {

		int flags = withNavigationBar ? View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE :
				View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
						| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
		window.getDecorView().setSystemUiVisibility(flags);
		window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
			window.setStatusBarColor(Color.TRANSPARENT);
		}
		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
			//设置页面全屏显示
			WindowManager.LayoutParams lp = window.getAttributes();
			lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
			//设置页面延伸到刘海区显示
			window.setAttributes(lp);
		}
	}

结果,navigationBar一会出现一会隐藏,不光闪还不按预期出牌,这个方案out。

为什么设置DecorView的flags没有出现预期效果,网上的方案不行,那只能自己动手丰衣足食了。

看下showAtLocation的实现

 public void showAtLocation(IBinder token, int gravity, int x, int y) {
        if (isShowing() || mContentView == null) {
            return;
        }

        TransitionManager.endTransitions(mDecorView);

        d
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值