将PopupMenu锚定到Navigationview菜单项

时间:2016-12-20 09:12:43

标签: android popupmenu navigationview

由于这个问题及其答案没有出现在任何地方,我想我也可以通过分享我找到的方式做出一点贡献。

因此我将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无需锚定。

1 个答案:

答案 0 :(得分:0)

所以我想你可以在菜单项中创建一个空视图,如下所示: 创建一个布局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是锚点。