由于这个问题及其答案没有出现在任何地方,我想我也可以通过分享我找到的方式做出一点贡献。
因此我将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无需锚定。
答案 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是锚点。