49

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

5 回答 5

126

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

显示弹窗:

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;
}

菜单:

<?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,因此您必须检查这种情况并锚定到另一个视图。

于 2013-02-07T06:50:37.040 回答
2

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

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();
}

这里的关键是,iteminonOptionsItemSelected(MenuItem item)必须显示在 ActionBar 上。如果item是当您按下 ActionBar 右上角的 3 个垂直点时出现的项目之一,那么您的应用程序将崩溃。

在此处输入图像描述

于 2020-05-08T18:32:28.870 回答
0

请试试这个..

  @Override
public boolean onOptionsItemSelected(MenuItem item){
    String str=item.getTitle().toString(); 
    Toast.makeText(getBaseContext(), str,Toast.LENGTH_LONG). show();

    View view=findViewById(item.getItemId()); 
    switch(view.getId()){
        case Menu.FIRST:
            showPopup(view); // calling method
    }

    return super.onOptionsItemSelected(item);
}   

// custom method
private void showPopup(final View view) {
    PopupMenu popupMenu = new PopupMenu(view.getContext(), view);
    popupMenu.getMenu().add(0, 0, Menu.NONE, "Item 1");
    popupMenu.getMenu().add(0, 1, Menu.NONE, "Item 2");
    popupMenu.getMenu().add(0, 2, Menu.NONE, "Item 3");
    popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                Toast.makeText(view.getContext(), item.getTitle() + "clicked", Toast.LENGTH_SHORT).show();
                return true;
            }
        });
    popupMenu.show();
}
于 2020-05-04T10:10:12.327 回答
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);
    }

在此处输入图像描述

于 2021-02-06T17:42:16.977 回答
-5
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

于 2013-02-06T13:04:57.557 回答