2015-11-05 60 views
0

我想在Android应用程序中创建一个PopupMenu。因为该应用程序的主窗口使得只有极少使用的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()报告的值,我得到的东西接近我的设备的屏幕尺寸(高度取决于动作条可见性),这表明我处理占据了屏幕的大部分景色。

我已经尝试过用重力来修补(如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从不阻碍其相关的视图。因为在我的情况下,相关的视图会占用整个空间,只留下菜单的ActionBar。当操作栏被隐藏时,实际上没有地方放置菜单。

因此,解决方案将创建一个虚拟视图作为菜单的锚点。有两种可能性:

  • 浮动在主视图顶部的透明视图。这将允许将菜单虚拟放置在主视图的任何位置,唯一的限制是它不能与顶部或底部边缘对齐(因为锚会将它与边缘分开)。

  • 放置在主视图边缘的高度或宽度为零的视图。这将使菜单与相应的边缘对齐。使用重力,菜单可以放置在主视图的一个角落。虽然我不确定Android是否允许视图的尺寸为零。

我需要做一些更多的测试才能找到答案。

+0

原来,有一种更简单的方法来实现我想要的 - 特别是显示选项菜单。我没有创建一个具有相同内容的弹出菜单,而是我可以简单地从Activity中调用'openOptionsMenu()'。菜单将显示在默认位置,这对我来说可以,并且可能会沿着整个屏幕高度(不包括系统栏)进行扩展。 – user149408