Adz*_*Adz 5 android reference view android-actionbar
当他们第一次启动应用程序时,我正在使用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);
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码有效.
是否可以在onCreateOptionsMenu中获取视图引用?我尝试的其他所有内容都为我提供了一个视图的空对象引用.
我也试过这个答案,但没有成功.
我应该提一下,对于actionBar,我使用了android的动作栏教程.
多谢你们.
编辑:
这就是我现在尝试做的事情:
@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);
}
Run Code Online (Sandbox Code Playgroud)
错误:
java.lang.NullPointerException:尝试在空对象引用上调用虚方法'void android.view.View.getLocationInWindow(int [])'
您可以menu.findItem(R.id.youritemid)获取菜单项,并且可以在方法中获取对菜单对象的引用 onCreateOptionsMenu(Menu menu),然后可以使用该菜单对象初始化全局变量以在任何地方使用它。
这是一些代码:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
_menu = menu;
return true;
}
Run Code Online (Sandbox Code Playgroud)
我Menu _menu;用菜单对象初始化我的全局变量,然后我可以MenuItem mi = _menu.findItem(R.id.itemid);在任何我想要的地方这样做。
编辑: 请注意,在创建菜单之前,不要在 menuitem 上调用任何内容,您可以安排一个线程等待 3 到 5 秒,或者您可以通过其他方式执行此操作,您应该担心的是菜单是否有是否已初始化。