PopupWindow在API>=5.1时显示时需要注意的

在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)来做适配,也可以根据系统版本号来做相应的操作。

你可能感兴趣的:(PopupWindow在API>=5.1时显示时需要注意的)