如何获取菜单ID?

时间:2017-04-17 23:47:17

标签: android menu toolbar showcaseview

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

我遇到的麻烦是我无法获得这些"三个点" ID。 如何获取或设置这些三点菜单的ID?

2 个答案:

答案 0 :(得分:0)

只是查找了源代码,这个按钮没有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);
}

可能会失败,但无论如何都要尝试。仅适用于工具栏,而不适用于ActionBar。如果它工作,您可能不应该使用它,因为如果字段名称在新版本中更改或在其他API中不同,则它将不起作用。此外,如果您尝试获取不存在的溢出按钮,它将失败。 (仍然值得投入努力:)

祝你好运。

答案 1 :(得分:0)

您应该能够保持对

溢出视图的引用
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);
}

然后使用showcase

定位该视图
new MaterialShowcaseView.Builder(this)
                    .setTarget(view)
                    .show();