summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/widget/PopupWindow.java25
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;