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);
Finally figured out what the problem was. In the code above I use .measure() and then .getMeasuredWidth/Height() to get the measurements of the view that I am trying to position. Unfortunately these were actually less than the values of getWidth() and getHeight() after the view had been displayed. I ended up overriding onSizeChanged so that I could keep track of the size after the view was displayed. Once the view was displayed, I grab the correct width/height and display the popup in its correct postion immediately.
Hope this helps someone else, though I'm not sure why getMeasuredWidth/Height were returning smaller values.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With