在`ActionBar`项目上单击显示弹出菜单

pcu*_*pcu 47 android popupmenu android-actionbar

我有一个ActionBar行动项目.单击操作项后,我想显示一个弹出菜单.我实现了这个方法,但是我希望将它锚定到操作项或者ActionBar布局中的任何视图.如何获得某种视图来锚定它MenuItem

public boolean onOptionsItemSelected(MenuItem item) {
    PopupMenu popupMenu = new PopupMenu(this, ??????); // What view goes here?
    popupMenu.inflate(R.menu.counters_overflow);
    popupMenu.show();
    // ...
    return true;
}
Run Code Online (Sandbox Code Playgroud)

pcu*_*pcu 115

最后我找到了解决方案.当您想要在ActionBar中将popupmenu锚定到ActionItem时,您需要找到呈现ActionItem的视图.使用findViewById()查找简单查看视图,其中id与xml中菜单项的id相同.

显示POPUP:

public boolean onOptionsItemSelected(MenuItem item) {
    // ...

    View menuItemView = findViewById(R.id.menu_overflow); // SAME ID AS MENU ID
    PopupMenu popupMenu = new PopupMenu(this, menuItemView); 
    popupMenu.inflate(R.menu.counters_overflow);
    // ...
    popupMenu.show();
    // ...
    return true;
}
Run Code Online (Sandbox Code Playgroud)

菜单:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

     ....

     <item
    android:id="@+id/menu_overflow"
    android:icon="@drawable/ic_overflow"
    android:showAsAction="ifRoom"
    android:title="@string/menu_overflow"/>

     ....

</menu>
Run Code Online (Sandbox Code Playgroud)

如果菜单项不可见(溢出)则不起作用.findViewById返回null,因此您必须检查此情况并锚定到另一个视图.

  • findViewById(R.id.menu_overflow)给我一个空视图 (9认同)
  • 如果您在非活动根视图中找到findViewById(R.id.menu_overflow),则返回null.使用Activity.findViewById(R.id.menu_overflow)和一切ok =)) (6认同)