在溢出按钮上锚定弹出菜单

anchor popup menu over overflow button

我正在尝试创建一个自定义弹出菜单,我想将其放置在操作栏的溢出菜单按钮上(如果重要的话,我正在使用 ToolbarsetSupportActionBar()) .我发现这可以用 setAnchorView() 来完成(来自阅读 )。

但是我似乎无法弄清楚如何将溢出菜单检索为视图(我可以用来设置锚点)。

我也试过将它锚定到 activity 本身的父布局,但它出现在左上角,菜单的高度等于操作栏的高度(这不是很有用)。

有人知道如何实现吗?

您可以 "cheat" 一点而不是实际的溢出菜单。在您的操作栏中有一个看起来像溢出图标的图标。您应该将 showAsAction 设置为始终在此 MenuItem 上。单击溢出图标时,您会显示锚定到 MenuItem 视图的 ListPopupWindow。如果 ListPopupWindow 没有出现在您想要的位置,您可以调用 ListPopupWindow.setHorizontalOffset()ListPopupWindow.setVerticalOffset()

我同意 Andrew Orobator 的观点,因为它很可能需要 "faked" 但我建议向您的工具栏添加一个实际视图,而不是尝试处理菜单项:

<?xml version="1.0" encoding="utf-8"?>
   <android.support.v7.widget.Toolbar
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@+id/toolbar"
   android:layout_height="wrap_content"
   android:layout_width="match_parent"
   android:minHeight="?attr/actionBarSize"
   android:background="?attr/colorPrimary"
   android:elevation="@dimen/elevation_med">

<ImageView
    android:id="@+id/overflow"
    android:layout_width="2dp"
    android:layout_height="2dp"
    android:background="@drawable/overflow_icon"
    android:layout_gravity="right"/>

</android.support.v7.widget.Toolbar>

这样就可以通过toolbar.findViewById(R.id.overflow)直接从工具栏中获取视图了;或类似的东西,然后将视图设置为锚点。这意味着您还必须为其设置自己的 onClick 侦听器,因为它将不再获得 onOptionsMenu() 回调,但我认为这将是处理您的场景的最佳方式。

我在这里学习了如何从菜单项中获取视图:Android : Get view Reference to a Menu Item

  1. 在您的 onOptionsItemSelected 方法中调用 View v = findViewById(R.id.overflow)

  2. 将该视图用作弹出菜单中的锚点:PopupMenu popupMenu = new PopupMenu(this, v);