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

时间:2013-02-06 12:54:00

标签: android android-actionbar popupmenu

我有一个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;
}

4 个答案:

答案 0 :(得分:110)

所以最后我找到了解决方案。当您想要在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;
}

MENU:

<?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>

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

答案 1 :(得分:1)

可接受的答案对我不起作用,因此我通过反复试验发现了问题。

public boolean onOptionsItemSelected(MenuItem item) 
{
    View menuItemView = findViewById(item.getItemId()); 
    showPopupMenu(menuItemView)

    return true;
}

private void showPopupMenu(View anchor)
{
    PopupMenu popup = new PopupMenu(this, anchor);
    popup.getMenuInflater().inflate(R.menu.my_popup_menu, popup.getMenu());
    popup.show();
}

此处的关键在于,必须在ActionBar上显示item中的onOptionsItemSelected(MenuItem item)。如果item是当您按下ActionBar右上方的3个垂直点时出现的项目之一,则您的应用将崩溃。

enter image description here

答案 2 :(得分:0)

除了接受的答案之外,每次调用 onOptionsItemSelected() 方法时重新膨胀弹出窗口的问题可以通过只执行一次并根据需要显示多次来简化。
(这甚至适用于在运行时通过 Menu Layout Inflater 膨胀的自定义工具栏。请记住,只有当视图实际出现在屏幕上时,用于获取菜单项视图的 findViewById() 才能返回非空值,即应该在工具栏/操作栏上可见。

注意:如果视图是在工具栏/操作栏的溢出菜单中预设的,则视图可能只有在至少调用一次溢出菜单后才会膨胀 - 使用 3 个点?)

public class SomeActivity{
    
    private PopupMenu popup;
    .... // some code of the activity

@Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        int menuItem = item.getItemId();
        switch (menuItem) {
            case R.id.tb_menu_plus:
                View menuItemView = findViewById(R.id.tb_menu_plus);
                if(popup == null) {
                    popup = new PopupMenu(this, menuItemView);
                    popup.inflate(R.menu.dropdown_popup_menu);
                }
                popup.show();
                return true;
        }
        return super.onOptionsItemSelected(item);
    }

enter image description here

答案 3 :(得分:-3)

public boolean onOptionsItemSelected(MenuItem item) {
    final View addView = getLayoutInflater().inflate(R.layout.add, null);

            new AlertDialog.Builder(this).setTitle("Add a Word").setView(addView)
                    .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            addWord((TextView) addView.findViewById(R.id.title));
                        }
                    }).setNegativeButton("Cancel", null).show();
return (super.onOptionsItemSelected(item));
    }

在这里获取完整的源表格..

http://vimaltuts.com/android-tutorial-for-beginners/android-action-bar-tab-menu-example