【问题标题】:How to get menu id?如何获取菜单 ID?
【发布时间】:2017-09-13 15:41:23
【问题描述】:

我有一个片段。在其中我有一个溢出菜单(工具栏上的三个点)。 我需要通过Material Showcase 突出显示它们。

我面临的麻烦是我无法获得这些“三个点”id。 如何获取或设置这些三点菜单的id?

【问题讨论】:

  • 三个点称为溢出图标。请参阅this questionthis one 了解如何更改图标,这就是我理解您想要做的。
  • @NicolasMaltais 这与图标无关。这是关于过低的id。我需要它的 id 才能找到 ViewById。
  • 发布您的菜单 xml 和片段代码

标签: android menu toolbar showcaseview


【解决方案1】:

刚查了源码,这个按钮没有id,是代码根据需要添加的。如果你只是想突出显示它,我强烈建议你只用样式或主题更改图标或其颜色。

如果您仍然想获得该视图,那么您可以尝试我的(未经测试的)代码:

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);  // That's your toolbar here
try {
    // Toolbar has a private field mMenuView. Get it.
    Field menuViewField = Toolbar.class.getDeclaredField("mMenuView");
    menuViewField.setAccessible(true);
    ActionMenuView menuView = (ActionMenuView) menuViewField.get(toolbar);

    // ActionMenuView has a private field mPresenter. Get it.
    Field menuPresenterField = ActionMenuView.class.getDeclaredField("mPresenter");
    menuPresenterField.setAccessible(true);
    Object menuPresenter = menuPresenterField.get(menuView);

    // ActionMenuPresenter has a private field mOverflowButton. Go get your button.
    Class<?> menuPresenterClass = Class.forName("android.widget.ActionMenuPresenter");
    Field overflowBtnField = menuPresenterClass.getDeclaredField("mOverflowButton");
    overflowBtnField.setAccessible(true);
    ImageButton overflowBtn = (ImageButton) menuPresenterField.get(menuPresenter);

} catch (Exception e) {
    Log.d(TAG, "Couldn't find overflow button", e);
}

可能会失败,但还是试试吧。仅适用于工具栏,不适用于操作栏。如果它有效,您可能不应该使用它,因为如果字段名称在新版本中更改或在其他 API 中不同,它将不起作用。此外,如果您尝试获取不存在的溢出按钮,它将失败。 (仍然值得为这项努力投票:)

祝你好运。

【讨论】:

  • 卡在“无法解析符号'ActionMenuPresenter'”。没有关于导入谷歌的建议..
  • 我更改了我的代码。确保为 Toolbar 和 ActionMenuView 导入 v7 类
【解决方案2】:

您应该能够保留对溢出视图的引用

private View view;

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    MenuItem actionViewItem = menu.findItem(R.id.your_menu_item);
    view = MenuItemCompat.getActionView(actionViewItem);
    return super.onPrepareOptionsMenu(menu);
}

然后使用展示定位该视图

new MaterialShowcaseView.Builder(this)
                    .setTarget(view)
                    .show();

【讨论】:

  • 这会返回 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.getLocationInWindow(int[])' on an null object reference..
  • 是在 onPrepareOptionsMenu 之前调用的展示构建器吗?
猜你喜欢
  • 2017-09-25
  • 2021-12-17
  • 1970-01-01
  • 2013-06-01
  • 2011-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-13
相关资源
最近更新 更多