Расположение всплывающего окна в Android - PullRequest
3 голосов
/ 17 ноября 2011

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

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

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

Заранее спасибо!

    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 ]

3 голосов
/ 20 ноября 2011

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

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

1 голос
/ 17 ноября 2011

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

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

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

<uses-sdk android:minSdkVersion="3" android:targetSdkVersion="8" />

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...