Позиционирование всплывающего окна в Android

В настоящее время я пытаюсь расположить всплывающее окно динамически на экране на основе элемента привязки. По какой-то причине, когда я помещаю этот элемент, он появляется примерно на 100 пикселей слева от того, где я его хочу. Например, если я разместил его на якоре рядом с краем экрана, всплывающее окно должно появиться с правым краем слева от правого края якоря. Однако всплывающее окно появляется на краю экрана. Если я вычитаю 100 из моего вычисления xPos, тогда он отлично работает.

Я проверил свою математику и прошел через код дисплея, чтобы проверить, что значения не выходят неправильно, поэтому я не уверен, что вызывает проблему. Я просто изучаю взгляды в андроиде, поэтому, я уверен, что я что-то пропускаю. Надеюсь, кто-то здесь узнает!

Я разместил отображаемый код ниже и был бы рад опубликовать что-нибудь еще, если потребуется.

Спасибо заранее!

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);
2 ответа

Наконец выяснилось, в чем проблема. В приведенном выше коде я использую .measure(), а затем .getMeasuredWidth/Height(), чтобы получить измерения представления, которое я пытаюсь установить. К сожалению, они были на самом деле меньше значений getWidth() и getHeight() после отображения представления. Я закончил переопределять onSizeChanged, чтобы я мог отслеживать размер после отображения представления. После отображения представления я получаю правильную ширину/высоту и сразу показываю всплывающее окно в правильной позиции.

Надеюсь, это поможет кому-то другому, хотя я не уверен, почему getMeasuredWidth/Height возвращали меньшие значения.


Вы можете проверить правильность возвращаемого значения this.windowManager.getDefaultDisplay().getWidth();?

Если нет, это может быть аналогичная проблема, как в Android: отображение неправильного разрешения экрана

Попробуйте добавить

в файл манифеста.

licensed under cc by-sa 3.0 with attribution.