繁体   English   中英

在“ActionBar”项目点击显示弹出菜单

[英]Show popup menu on `ActionBar` item click

我有一个带有操作项的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;
}

所以最后我找到了解决方案。 当您想将弹出菜单锚定到 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,因此您必须检查这种情况并锚定到另一个视图。

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

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

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

在此处输入图像描述

请试试这个..

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

除了接受的答案之外,在每次调用 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);
    }

在此处输入图像描述

如果您不希望在单击特定项目时菜单消失,则在该项目上return false

        @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
        switch (item.getItemId())
        {
            case R.id.itemShare_:
                onShareClicked();
                return true;    // the menu will be gone
            case R.id.itemCopy_:
                onCopyClicked();
                return true;    // the menu will be gone
            case R.id.itemSelectAll_:
                onSelectAllClicked();
                return false;   // the menu will stay

               // ...
       }
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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM