将 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 是锚点。
既然这个问题和它的答案没有出现在任何地方,我想我不妨通过分享我找到的方式来贡献一点。
所以我在将 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 是锚点。