Android - PopupWindow над определенным представлением
Я разрабатываю приложение для Android, и я использую всплывающее окно, когда пользователь нажимает на определенный объект панели меню (состоящий из небольших изображений, выстроенных по горизонтали) в нижней части экрана.
В щелчке я хочу, чтобы всплывающее окно было привязано к верхнему левому углу просмотра, которое было нажато и показано сверху.
Единственными методами, которые кажутся релевантными, являются showAsDropDown (View anchor, int xoff, int yoff) и showAtLocation (View parent, int gravity, int x, int y). Проблема с showAsDropDown заключается в том, что она привязана к нижнему левому углу представления.
Есть ли другой способ реализовать это?
Ответы
Ответ 1
popupWindow.showAtLocation(...)
фактически показывает, что окно абсолютно позиционируется на экране (даже приложение). Якорь в этом вызове используется только для его токена окна. Координаты являются смещениями от заданного значения силы тяжести.
Что вы на самом деле хотите использовать:
popupWindow.showAsDropDown(anchor, offsetX, offsetY, gravity);
Этот вызов доступен только в API 19+, поэтому в более ранних версиях вам необходимо использовать:
popupWindow.showAsDropdown(anchor, offsetX, offsetY);
Эти вызовы показывают всплывающее окно относительно указанного представления привязки. Обратите внимание, что гравитация по умолчанию (при вызове без заданной силы тяжести) равна Gravity.TOP|Gravity.START
, поэтому, если вы явно используете Gravity.LEFT
в разных местах вашего приложения, у вас будет плохое время:)
Ответ 2
popupWindow.showAtLocation(anchor, Gravity.BOTTOM, 0, anchor.getHeight());
Ответ 3
Тот, который вы хотите использовать, showAtLocation(...)
. Вы указываете якорный вид (тот, который пользователь нажимает), и расположите его относительно этого с помощью параметра gravity
и смещения. Подумайте о параметре gravity
, таком как PopupWindow
, почти как дочерний вид, а родительский вид похож на макет контейнера.
Вы должны указать Gravity.LEFT | Gravity.TOP
в качестве параметра.
Ответ 4
Вам просто нужно было переместить popupWindow по высоте его привязки, используя параметр yoff в синтаксисе showAsDropDown (View anchor, int xoff, int yoff).
popupWindow.showAsDropDown(anchor, 0, -anchor.getHeight()+popupView.getHeight);
Кроме того, представьте, что если максимальная высота, разрешенная для привязки, не допускает преобразования, всплывающее окно может отображаться неправильно.
Ответ 5
У меня есть этот код: PopupWindow ниже определенного вида (Gravity End) для всех версий sdk.
// display the popup[![enter image description here][1]][1]
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
mPopupWindow.showAsDropDown(v, 0, 0, Gravity.END);
} else {
mPopupWindow.showAsDropDown(v, v.getWidth() - mPopupWindow.getWidth(), 0);
}
Здесь View v - это календарь ImageButton.
Ответ 6
popupwindow.showAsDropDown(anchor, 0, -125);
эта вещь работает для меня