Android PopupMenu 裁剪到 ActionBar 的边界

Android PopupMenu clipped to boundaries of ActionBar

我正在尝试在 Android 应用程序中创建 PopupMenu。由于应用程序的主 window 只使用了很少的 Android 布局元素(本质上它是一个大图形),我在主 Activity 中使用以下代码:

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 的整个高度,并且总是在底端被剪裁。

什么给了?

我想我已经找到了这种行为的可能原因。显然,PopupMenu 从不阻碍其关联的视图。因为在我的例子中,关联的视图占据了整个 space,所以只留下菜单的 ActionBar。当操作栏被隐藏时,几乎没有地方可以放置菜单。

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

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

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

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