将 PopupMenu 锚定到 Navigationview 菜单项

Anchoring a PopupMenu to Navigationview menu items

既然这个问题和它的答案没有出现在任何地方,我想我不妨通过分享我找到的方式来贡献一点。

所以我在将 PopupMenu 对象锚定到 NavigationView 菜单时遇到了这个问题,因为我无法以视图的形式从中获取任何项目:

//onCreate:
     NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);
        drawerMenu = navigationView.getMenu();


//onNavigationItemSelected(MenuItem menuItem):
     switch (menuItem.getItemId()) {
                case R.id.menubutton_submenuButton:
                    //the following line is merely how I'd imagine it should be
                    PopupMenu popupMenu = new PopupMenu(this, drawerMenu.findItem(R.id.menubutton_submenuButton));
                    popupMenu.getMenuInflater().inflate(R.menu.sub_menu, popupMenu.getMenu());
                    popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                        @Override
                        public boolean onMenuItemClick(MenuItem item) {
                            //handle the inflated menu's buttons here
                            return true;
                        }
                    });
                    popupMenu.show();
                    break;
    }

那么,问题就出在这里

drawerMenu.findItem(R.id.menubutton_submenuButton));

不是任何类型的视图,因此 PopupMenu 没有任何内容可以锚定。

所以我认为您可以在菜单项内创建一个空视图,如下所示: 创建一个仅包含以下内容的布局 xml 文件:

<?xml version="1.0" encoding="utf-8"?>
<View
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    />

我们称它为“view_empty”。

现在,通过向菜单项中添加以下行,菜单项中应该包含空视图布局:app:actionLayout="@layout/drawer_empty"
我的项目如下所示:

<item
                android:id="@+id/menubutton_submenuButton"
                android:title="example menu item"
                app:actionLayout="@layout/view_empty"/>

那么,剩下的就是使用它了:

//onNavigationItemSelected(MenuItem menuItem) {
        switch (menuItem.getItemId()) {
            case R.id.menubutton_submenuButton:
                MenuItem item = drawerMenu.findItem(R.id.menubutton_submenuButton);
                PopupMenu popupMenu = new PopupMenu(this, MenuItemCompat.getActionView(item));
                popupMenu.getMenuInflater().inflate(R.menu.sub_menu, popupMenu.getMenu());
                popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                    @Override
                    public boolean onMenuItemClick(MenuItem item) {
                        //handle the inflated menu's buttons here
                        return true;
                    }
                });
                popupMenu.show();
                break;

现在发生的事情是,PopupMenu 将自身锚定到 menuItem 内的一个不可见视图,从而使其看起来像容器 menuItem 是锚点。