Мне нужно показать 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()
принимает родительский вид в качестве аргумента вместе с гравитацией и смещением местоположения.
button
находится в середине экрана. Даже если бы я установил offset
вручную, это не сработает на разных размерах экрана.
- person Eugene; 20.09.2011
button
может быть везде.
- person Eugene; 21.09.2011