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