Привязка элементов меню 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 ответ

Решение

Поэтому я подумал, что вы можете просто создать пустое представление внутри пункта меню следующим образом: создать 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 - точка привязки.

Другие вопросы по тегам