如何捕获对菜单项的长按?
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 这样的长按菜单? [反应原生]