我正在使用MaterialShowcaseView向用户显示第一次启动应用时的快速教程。
我遇到的问题是,当用户在onOptionsItemSelected中选择该项时,我只能获取操作栏项中项目的视图参考。
即
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.my_location:
// User chose the "Favorite" action, mark the current item
// as a favorite...
ShowcaseConfig config = new ShowcaseConfig();
config.setDelay(500); // half second between each showcase view
MaterialShowcaseSequence sequence = new MaterialShowcaseSequence(this, SHOWCASE_ID);
sequence.setConfig(config);
sequence.addSequenceItem(findViewById(R.id.action_my_location),
"This is button one", "GOT IT");
sequence.start();
Toast.makeText(MapsActivity.this, "My location action press", Toast.LENGTH_SHORT).show();
return true;
default:
// If we got here, the user's action was not recognized.
// Invoke the superclass to handle it.
return super.onOptionsItemSelected(item);
}
}
以上代码有效。
是否可以在onCreateOptionsMenu中获取视图引用?我尝试的其他所有内容都为视图提供了一个空对象引用。
我也试过this answer,但没有成功。
我应该提到,对于actionBar,我使用了android的action bar tutorial。
谢谢你们。
编辑:
这就是我现在尝试做的事情:
@Override
public void invalidateOptionsMenu() {
super.invalidateOptionsMenu();
}
MenuItem mi;
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
mi = menu.findItem(R.id.action_my_location);
new MaterialShowcaseView.Builder(this)
.setTarget(mi.getActionView())
.setDismissText("GOT IT")
.setContentText("This is some amazing feature you should know about")
.setDelay(300) // optional but starting animations immediately in onCreate can make them choppy
.singleUse("101010110") // provide a unique ID used to ensure it is only shown once
.show();
return super.onPrepareOptionsMenu(menu);
}
错误:
java.lang.NullPointerException:尝试调用虚方法'void null对象上的android.view.View.getLocationInWindow(int [])' 参考
答案 0 :(得分:4)
您可以menu.findItem(R.id.youritemid)
来获取菜单项,然后您可以在onCreateOptionsMenu(Menu menu)
方法中获得对菜单对象的引用,然后您可以使用该菜单对象初始化全局变量,以便在任何地方使用它。 / p>
以下是一些代码:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generate d method stub
getMenuInflater().inflate(R.menu.main, menu);
_menu = menu;
return true;
}
我使用菜单对象初始化我的全局变量Menu _menu;
然后我可以像我想要的那样MenuItem mi = _menu.findItem(R.id.itemid);
。
修改强> 菜单创建之前请注意你没有在menuitem上调用任何东西,你可以安排一个线程等待3到5秒,或者你可以用其他方式来做,你应该担心的是菜单是否已经初始化或不。
答案 1 :(得分:0)
你需要这个课程:
public class ToolbarActionItemTarget implements Target {
private final Toolbar toolbar;
private final int menuItemId;
public ToolbarActionItemTarget(Toolbar toolbar, @IdRes int itemId) {
this.toolbar = toolbar;
this.menuItemId = itemId;
}
@Override
public Point getPoint() {
return new ViewTarget(toolbar.findViewById(menuItemId)).getPoint();
}
所以:
showcaseView = new ShowcaseView.Builder(getActivity())
.setTarget(Target.NONE)
.setTarget(new ToolbarActionItemTarget(toolbar, R.id.action_view))
参考:https://github.com/amlcurran/ShowcaseView/releases/tag/5.3.0
`