I'm currently trying to position a popup window dynamically on screen based on an anchor element. For some reason, when I position this element it appears about 100px to the left of where I want it. For instance, if I position it on an anchor near the edge of the screen the popup window should appear with its right edge just to the left of the anchors right edge. However, the popup window appears flush to the edge of the screen. If I subtract 100 from my calculate xPos then it works fine.
I have checked my math and have stepped through the display code to check that the values are not coming out incorrectly, so I'm not sure what is causing the problem. I'm just learning views in android though, so I'm sure I am overlooking something. Hopefully someone here will know!
I've posted the display code below, and would be happy to post anything else if needed.
Thanks in advance!
int[] location = new int[2];
this.anchor.getLocationOnScreen(location);
Rect anchorRect =
new Rect(location[0], location[1], location[0] + this.anchor.getWidth(), location[1]
+ this.anchor.getHeight());
this.anchorRectangle = anchorRect;
this.root.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
this.root.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
int rootWidth = this.root.getMeasuredWidth();
int rootHeight = this.root.getMeasuredHeight();
int screenWidth = this.windowManager.getDefaultDisplay().getWidth();
int xPos, yPos;
// Align popup with right side if the root is wider than anchor
// Align with left otherwise
if (rootWidth > anchorRect.right - anchorRect.left) {
xPos = anchorRect.right - rootWidth;
} else {
xPos = anchorRect.left + 15;
}
// Correct for spilling off the edge
if (xPos + rootWidth > screenWidth)
xPos = screenWidth - rootWidth - 20;
// xPos = ((screenWidth - rootWidth) / 2) + xOffset;
yPos = anchorRect.top - rootHeight + yOffset;
this.rootRectangle = new Rect(xPos, yPos, xPos + rootWidth, yPos + rootHeight);
boolean onTop = true;
// display on bottom
if(rootHeight > anchorRect.top) {
onTop = false;
yPos = anchorRect.bottom + yOffset;
this.window.setAnimationStyle(R.anim.grow_from_top);
}
this.window.showAtLocation(this.anchor, Gravity.NO_GRAVITY, xPos, yPos);