Android - 以编程方式选择菜单选项

10
有没有一种编程方式可以选择菜单选项?基本上,我想在视图中添加一个按钮,使其执行与按下特定菜单选项相同的操作。我考虑尝试调用onOptionsItemSelected(MenuItem item),但我不知道该放什么菜单项。
3个回答

17

是的,有一种方法可以选择菜单选项!您关于调用onOptionsItemSelected(MenuItem item)的想法是正确的,以下是获取MenuItem的方法:

1)首先,您需要在Activity中获取Menu类的引用:

private Menu menu;

@Override
public boolean onCreateOptionsMenu(final Menu menu) {
   this.menu = menu;
   return super.onCreateOptionMenu(menu);
}

2) 因此,Menu类包含您所有的菜单项。因此,一旦您拥有此引用,可以像这样模拟菜单单击:

onOptionsItemSelected(menu.findItem(R.id.action_id));

...其中action_id是您要选择的菜单项的ID。您可以在菜单XML中找到此ID。


15

为什么不让UI事件调用一个公共方法?


1
最简单的答案通常是最好的 ;) +1 - Squonk
我在onOptionsItemSelected()中有一些共享代码,适用于所有菜单项,我宁愿不要将其拆分。我只是希望能够轻松调用菜单选项。 - dt0
@dt0 总是有办法重构代码,使其变得简洁漂亮,尤其是自己的代码。 如果共享的代码是一堆运行时变量,也许你可以使用一个结构来将所有变量放在一个地方。如果是功能性的东西,也许你可以将其提取为实用方法。 总是有办法的,我强烈建议不要从一个UI事件调用另一个UI事件。 如果你考虑一下你的代码的表达力,菜单没有被点击,所以调用菜单点击事件有点奇怪。 - Rich
好的,谢谢Rich。我采纳了你的建议。我意识到我不需要拆分任何东西,只需将整个onOptionsItemsSelected()方法提取出来即可。 - dt0
在我的情况下,它不起作用,因为我正在使用ShareActionProvider,并且我希望实现与用户单击相同的效果。-1 - Felipe
在测试时,能够以编程方式选择菜单选项是非常有用的,以确保选择实际起作用。 - user153275

2

我也在寻找这个答案。虽然调用选中项目时使用的方法是有意义的,但这并不会在用户界面上将菜单项设置为选中状态。

所以我最终做的是:

NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);

MenuItem menuItem = (MenuItem)navigationView.getMenu().findItem(R.id.nav_menu_item_1);
        menuItem.setChecked(true);
        onNavigationItemSelected(menuItem);

以下代码对我来说并没有按照预期工作:

onOptionsItemSelected(menu.findItem(R.id.action_id));


如果您使用 NavigationView,则需要调用 onNavigationItemSelected(menuItem)。无论如何,如果在“@Override public boolean onOptionsItemSelected(MenuItem item)”中实现,也可以使用 onOptionsItemSelected(menu.findItem(R.id.action_id))。但是这种方式对于侧边导航是错误的。 - sVd
+sVd 那你是说这种侧边导航或任何导航的方式都是错误的吗?还有什么特定的情况下,这种方法才是正确的呢?我记得我尝试过一些东西,包括一些在这里列出的答案,但是我无法让它工作。这是我第一个正在开发的Android应用程序,所以我肯定犯了很多错误。这个项目是很久以前的事情了,而且我已经不在那家公司了。我希望能得到你的回复以供日后参考。既然这是我让它工作的唯一方法,我会把它放在这里。如果需要,我会在你的回复后进行更改或备注。 - Heriberto Lugo
1
Heriberto Lugo,我只是想说在使用NavigationView时,我们应该使用指定的接口 - public static interface NavigationView.OnNavigationItemSelectedListener 并在活动中实现它。这就是为什么使用onOptionsItemSelected是错误的但仍然可能的原因。就这些!;) - sVd
+sVd 感谢您的澄清。我在安卓开发方面非常菜鸟。 - Heriberto Lugo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接