我有一个片段。在其中我有一个溢出菜单(工具栏上的三个点)。 我需要通过Material Showcase突出显示它们。
我遇到的麻烦是我无法获得这些"三个点" ID。 如何获取或设置这些三点菜单的ID?
答案 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();