在API5.1开始PopupWindow添加了以下2个方法
- void setAttachedInDecor(boolean)
- boolean isAttachedInDecor()
主要作用是为了设置PopupWindow显示的时候是否会与StatusBar重叠(如果存在的话也包括SystemBar)
查看源码可以看到这个属性的默认值是不固定的,是由系统版本来确定的
public void setContentView(View contentView) {
if (isShowing()) {
return;
}
mContentView = contentView;
if (mContext == null && mContentView != null) {
mContext = mContentView.getContext();
}
if (mWindowManager == null && mContentView != null) {
mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
}
// Setting the default for attachedInDecor based on SDK version here
// instead of in the constructor since we might not have the context
// object in the constructor. We only want to set default here if the
// app hasn't already set the attachedInDecor.
if (mContext != null && !mAttachedInDecorSet) {
// Attach popup window in decor frame of parent window by default for
// {@link Build.VERSION_CODES.LOLLIPOP_MR1} or greater. Keep current
// behavior of not attaching to decor frame for older SDKs.
setAttachedInDecor(mContext.getApplicationInfo().targetSdkVersion
>= Build.VERSION_CODES.LOLLIPOP_MR1);
}
}
最终可以看到 当这个属性为true时为window 添加了一个新的FLAG
if (mAttachedInDecor) {
curFlags |= WindowManager.LayoutParams.FLAG_LAYOUT_ATTACHED_IN_DECOR;
}
需要注意在PopupWindow中部分的View可能是经过精确计算的,但在不同版本就可能产生出不同的效果了,这是就可以通过setAttachedInDecor(boolean)
来做适配,也可以根据系统版本号来做相应的操作。