diff options
| -rw-r--r-- | core/java/android/widget/PopupWindow.java | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/core/java/android/widget/PopupWindow.java b/core/java/android/widget/PopupWindow.java index d096baf3c943..26b3ae2c42fc 100644 --- a/core/java/android/widget/PopupWindow.java +++ b/core/java/android/widget/PopupWindow.java @@ -1620,17 +1620,32 @@ public class PopupWindow { int anchorHeight, int drawingLocationY, int screenLocationY, int displayFrameTop, int displayFrameBottom, boolean allowResize) { final int winOffsetY = screenLocationY - drawingLocationY; - final int anchorTopInScreen = outParams.y + winOffsetY; - final int spaceBelow = displayFrameBottom - anchorTopInScreen; - if (anchorTopInScreen >= 0 && height <= spaceBelow) { + final int popupScreenTop = outParams.y + winOffsetY; + final int spaceBelow = displayFrameBottom - popupScreenTop; + if (popupScreenTop >= 0 && height <= spaceBelow) { return true; } - final int spaceAbove = anchorTopInScreen - anchorHeight - displayFrameTop; + final int popupScreenBottom; + if (mOverlapAnchor) { + // popupScreenTop equals the anchor's top at this point. + // When shown above the anchor, an overlapping popup's bottom should be aligned with + // the anchor's bottom. + popupScreenBottom = popupScreenTop + anchorHeight; + } else { + // popupScreenTop equals the anchor's bottom at this point. + // When shown above the anchor, a non-overlapping popup's bottom is aligned with + // the anchor's top. + popupScreenBottom = popupScreenTop - anchorHeight; + } + final int spaceAbove = popupScreenBottom - displayFrameTop; if (height <= spaceAbove) { // Move everything up. if (mOverlapAnchor) { - yOffset += anchorHeight; + // Add one anchorHeight to compensate for the correction made at the start of + // findDropDownPosition, and another to account for being aligned to the anchor's + // bottom, not top. + yOffset += anchorHeight * 2; } outParams.y = drawingLocationY - height + yOffset; |