Мне нужно показать PopupWindow
под одним Views
, показанным на экране.
Как я могу вычислить координаты нужного View
и поместить под ним PopupWindow
? Пример кода более чем приветствуется. Спасибо.
Мне нужно показать PopupWindow
под одним Views
, показанным на экране.
Как я могу вычислить координаты нужного View
и поместить под ним PopupWindow
? Пример кода более чем приветствуется. Спасибо.
Найти уже отображаемое представление довольно просто - вот что я использую в своем коде:
public static Rect locateView(View v)
{
int[] loc_int = new int[2];
if (v == null) return null;
try
{
v.getLocationOnScreen(loc_int);
} catch (NullPointerException npe)
{
//Happens when the view doesn't exist on screen anymore.
return null;
}
Rect location = new Rect();
location.left = loc_int[0];
location.top = loc_int[1];
location.right = location.left + v.getWidth();
location.bottom = location.top + v.getHeight();
return location;
}
Затем вы можете использовать код, похожий на то, что Эрнеста предложила вставить всплывающее окно в соответствующем месте:
popup.showAtLocation(parent, Gravity.TOP|Gravity.LEFT, location.left, location.bottom);
Это отобразит всплывающее окно непосредственно под исходным представлением - не гарантирует, что будет достаточно места для отображения представления.
у вас есть getLeft()
и getBottom()
, чтобы получить точную позицию представления в макете. У вас также есть getWidth()
и getHeight()
, чтобы узнать точное пространство, занимаемое представлением. Если вы хотите поместить всплывающее окно под представлением.
Вы setLeft()
и setTop()
методы представления, чтобы расположить новое всплывающее окно.
Чтобы получить размер основного экрана приложения без таких элементов, как заголовки и панели уведомлений, переопределите следующий класс в классе, генерирующем экран (размеры измеряются в пикселях):
@Override
protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
}
Чтобы получить нижнюю координату представления, под которой вы хотите отобразить всплывающее окно:
View upperView = ...
int coordinate = upperView.getBottom();
До тех пор, пока height - coordinate
достаточно большой для вашего всплывающего окна, вы можете просто поместить всплывающее окно следующим образом:
PopupWindow popup = new PopupWindow();
Button button = new Button(this);
button.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
popup.showAtLocation(parent, Gravity.CENTER, 0, coordinate);
}
});
Здесь showAtLocation()
принимает родительское представление как аргумент вместе с смещениями силы тяжести и местоположения.