Как да покажа PopupWindow на специално място?

Трябва да покажа PopupWindow под едно Views показано на екрана.

Как мога да изчисля координатите на необходимия View и да поставя PopupWindow под него? Примерният код е повече от добре дошъл. Благодаря.


person Eugene    schedule 16.09.2011    source източник


Отговори (3)


isLeft =› едностранна производна: ies.co.jp/ math/java/calc/limrl/limrl.html
person zeetoobiker    schedule 21.09.2011
comment
+1 за този страхотен и полезен код. Съжалявам, че не мога да направя повече от това ;) - person S.Thiongane; 19.03.2014
comment
+1 Просто трябва да добавя някои неща, първо може да е по-добре да използвате само Gravity.NO_GRAVITY, а след това, ако искате да имате марж, така че изскачащият прозорец да не е на ръба, можете да извадите (напр. location.left - 50). Имайте предвид, че когато използвате location.right, трябва да измерите ширината на изскачащия прозорец. За измерване на изскачащ прозорец отидете тук stackoverflow.com /questions/15862052/. Краен код за прозорец с поле: location.left - popUpWindowWidth - 50 - person Kim Montano; 19.02.2016
comment
Приложимо ли е това решение за RTL оформления? Ако не, какви модификации са необходими, за да работи с конфигурация отдясно наляво? - person A.B.; 24.01.2017
comment
@ A. B. Трябва да се справите с условието за RTL. Горното отразява същото и за двете оформления, RTL и LTR. - person arshad shaikh; 09.08.2017
comment
@zeetoobiker Вашето решение работи перфектно! Но аз използвам SwitcherView в изскачащия прозорец. Така че след превключване на изгледа той променя позицията на изскачащия прозорец. Някаква идея? - person GreenROBO; 16.02.2018

имате getLeft() и getBottom(), за да получите точната позиция на изгледа в оформлението. Имате също getWidth() и getHeight(), за да знаете точното пространство, заето от изгледа. Ако искате да позиционирате изскачащия си прозорец под изглед.

Вие setLeft() и setTop() методите на изгледа, за да позиционирате новия изскачащ прозорец.

person Yashwanth Kumar    schedule 16.09.2011
comment
Можете ли да дадете някакъв пример? - person Vijay E; 11.06.2021

За да получите размер на основния екран на приложението без неща като заглавие и ленти за уведомяване, заменете следния метод в класа, генериращ въпросния екран (размерите се измерват в пиксели):

@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() приема родителския изглед като аргумент заедно с отместванията на гравитацията и местоположението.

person Community    schedule 20.09.2011
comment
Това работи само ако button е в средата на екрана. Дори и да задам offset ръчно, това няма да работи на различни размери на екрана. - person Eugene; 20.09.2011
comment
button може да бъде навсякъде. - person Eugene; 21.09.2011
comment
Изчакайте - така че предложеното от мен решение показва изскачащия прозорец точно под вашия бутон. Ако поставите бутона по-ниско, изскачащият прозорец също ще се появи по-ниско. И тъй като си представям, че изскачащият прозорец заема ширината на целия екран, всъщност няма значение дали бутонът е центриран хоризонтално или не. Или пропускам нещо тук? - person ; 21.09.2011
comment
Добър, View.getBottom(). Но имаше малък проблем в кода. Добавих тази промяна в секцията за редактиране - person Shaista Naaz; 05.12.2012