由于业务需要将底部的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

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





