如何捕获对菜单项的长按?

Posted

技术标签:

【中文标题】如何捕获对菜单项的长按?【英文标题】:How can I capture a long press on a Menu Item? 【发布时间】:2011-11-30 07:00:30 【问题描述】:

我有一个典型的菜单,我想为其中一项设置onLongClickListener。换句话说,我希望这个项目能够执行它正常的onOptionsItemSelected 功能,以及长按功能。

    MenuItem item;
    item = menu.findItem(android.R.id.home);

item.setOnLongClickListener(new OnLongClickListener() 
        public boolean onLongClick(View v) 
            Context context = getApplicationContext();
            CharSequence text = "Long Press";
            int duration = Toast.LENGTH_SHORT;

            Toast toast = Toast.makeText(context, text, duration);
            toast.show();
            return true;
        

    );

【问题讨论】:

【参考方案1】:

我可以通过简单地在 menuItem 上使用 setActionView 来做到这一点。如果有帮助,您可以按照此过程进行操作。

    for(int i = 0; i < menu.size(); i++)
        View v = new View(this);
        v.setOnLongClickListener(new View.OnLongClickListener() 
            @Override
            public boolean onLongClick(View v) 
                //Your longclick listener callback logic goes here
                return false;
            

        );
        menu.getItem(i).setActionView(v);
    

【讨论】:

【参考方案2】:

Menu 上使用findItem 方法来获取您的视图,并在每个视图上设置您的长点击监听器。

【讨论】:

不,Menu 对象上有一个名为 findItem 的方法。使用它来获取一个视图,并在视图上设置长点击监听器。 我得到同样的错误。该 OnLongClickListener 在 MenuItem 中未定义。你能再提供帮助吗? 抱歉,您需要视图的句柄。在菜单项上尝试 getActionView()。 我还没有完全掌握它的窍门,但感谢您的帮助。 而 getActionView() 当然返回 null,因为我的菜单项没有操作视图。OP 的问题是如何在 MenuItem 上捕获长按,而不是在菜单项的操作视图上。 【参考方案3】:

这种方法不对,它会扰乱整个流程,但是你去吧:

    private interface OnMenuItemLongClickListener
        boolean onMenuItemLongClik(MenuItem m);
    
    private void getMenuItemsView(Activity a, final Menu m, final OnMenuItemLongClickListener listener) throws NoSuchFieldException, IllegalArgumentException, IllegalAccessException
        View homeButton = a.findViewById(android.R.id.home);
        ViewParent parentOfHome = homeButton.getParent().getParent(); //ActionBarView is parent of home ImageView, see layout file in sources

        if (!parentOfHome.getClass().getName().contains("ActionBarView")) 
            parentOfHome = parentOfHome.getParent(); 
            Class absAbv = parentOfHome.getClass().getSuperclass(); //ActionBarView -> AbsActionBarView class
            Field actionMenuPresenterField = absAbv.getDeclaredField("mActionMenuPresenter");
            actionMenuPresenterField.setAccessible(true);
            Object actionMenuPresenter = actionMenuPresenterField.get(parentOfHome);
            Field actionMenuViewField = actionMenuPresenter.getClass().getSuperclass().getDeclaredField("mMenuView");
            actionMenuViewField.setAccessible(true);
            Object actionMenuView = actionMenuViewField.get(actionMenuPresenter);
            Field childrenField= actionMenuView.getClass().getSuperclass().getSuperclass().getDeclaredField("mChildren");
            childrenField.setAccessible(true);
            Field menuField =actionMenuPresenter.getClass().getSuperclass().getDeclaredField("mMenu");
            menuField.setAccessible(true);
            Object menu = menuField.get(actionMenuPresenter);
            Object[] menuItemsAsViews = (Object[])childrenField.get(actionMenuView);
            View.OnLongClickListener longListener = new View.OnLongClickListener() 

                @Override
                public boolean onLongClick(View v) 

                    return listener.onMenuItemLongClik(m.findItem(v.getId()));
                
            ;
            for(Object menuView:menuItemsAsViews )
                View v = (View)menuView;
                v.setOnLongClickListener(longListener);
            


    
 

用法:

@Override
public boolean onPrepareOptionsMenu(final Menu menu) 
        new Handler().postDelayed(new Runnable()

            @Override
            public void run() 
            getMenuItemsViews(MainActivity.this, menu);
            , 100); //must be called after the menu views are generated, otherwise NPE.
    return super.onPrepareOptionsMenu(menu);

MenuItem 的溢出WILL NOT 被考虑。

【讨论】:

以上是关于如何捕获对菜单项的长按?的主要内容,如果未能解决你的问题,请参考以下文章

问下长按是图片出现菜单项的时间在那调整,时间太长了

如何创建像 pinterest 这样的长按菜单? [反应原生]

在不禁用上下文菜单的情况下管理 UITextfiled 上的长按?

如何处理Android导航栏菜单键上的长按?

MFC SDI 应用程序,如何更改菜单项的标题?

Android:获取对菜单项的视图引用