2015-11-05 3 views
0

Я пытаюсь создать PopupMenu в приложении для Android. Так как главное окно приложения делает только минимальное использование элементов макета Android (по сути это большой рисунок), я использую следующий код в основной деятельности:Android PopupMenu обрезается до границ ActionBar

public void showMenu() { 
    View v = this.getCurrentFocus(); 
    PopupMenu popup = new PopupMenu(this, v); 
    this.prepareMenu(popup.getMenu()); // populate menu with items 
    popup.show(); 
} 

метод вызывается, когда пользователь задевает определенной области экрана.

Меню отображается поверх ActionBar, но не выходит за его пределы. Я могу прокручивать меню (таким образом, элементы есть), но я не могу понять, как заставить меню выйти за пределы ActionBar.

Приложение имеет полноэкранный режим, который скрывает ActionBar. Когда я это делаю, меню вообще не отображается. Выход из журнала показывает мне, что showMenu() вызывается при первом касании, но не на втором, что указывает на то, что меню открывается, хотя и скрыто или выключено, и отбрасывается при втором касании.

Когда я проверить значения, сообщенные v.getMeasuredHeight() и v.getMeasuredWidth(), я получаю что-то близкое к размеру экрана устройства (высота варьируется в зависимости от видимости ActionBar), указывая я имею дело с тем, что занимает большую часть экрана.

Я пробовал трястись с гравитацией (например, PopupMenu popup = new PopupMenu(this, v, Gravity.RIGHT | Gravity.TOP | Gravity.FILL_VERTICAL);), но безрезультатно. Я могу переключить позицию меню с верхнего левого на верхний правый, но размер всегда один и тот же.

Я также пробовал различные способы получения представления на якорь меню к, ​​как в

Window window = this.getWindow(); 
while ((window != null) && (window.getContainer() != null)) 
    window = window.getContainer(); 
View v = window.getDecorView(); 

, но с той лишь разницей, что для некоторых представлений меню не отображается на всех. Когда это происходит, он всегда распространяется на всю высоту ActionBar и всегда обрезается в нижнем конце.

Что дает?

ответ

0

Я думаю, что я нашел возможную причину такого поведения. По-видимому, PopupMenu никогда не препятствует связанному с ним представлению. Так как в моем случае связанный View занимает все пространство, которое оставляет только меню ActionBar для меню. Когда панель действий скрыта, буквально нигде не следует размещать меню.

Таким образом, решением было бы создать фиктивный вид в качестве привязки для меню. Для них есть две возможности:

  • Прозрачный вид, который плавает сверху основного вида. Это позволило бы разместить меню практически в любом месте на главном представлении, с единственным ограничением, которое не может быть выровнено с верхним или нижним краем (поскольку анкер будет отделять его от края).

  • A Вид с нулевой высотой или шириной, расположенный на краю основного вида. Это приведет к выравниванию меню с соответствующим краем. Используя Gravity, меню можно поместить в угол основного вида. Хотя я не уверен, что Android разрешает размеры представления равным нулю.

Мне нужно сделать еще несколько тестов, чтобы узнать.

+0

Оказывается, есть гораздо более простой способ добиться того, что я хотел - в частности, чтобы показать меню «Параметры».Вместо того, чтобы создавать всплывающее меню с тем же контентом, я обнаружил, что могу просто вызвать 'openOptionsMenu()' из Activity. Меню будет отображаться в позиции по умолчанию, что для меня нормально, и оно будет расширяться потенциально по всей высоте экрана (за исключением системных баров). – user149408

Смежные вопросы