Android获取对操作栏项的View参考?

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 [])'

Qan*_*asi 5

您可以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 秒,或者您可以通过其他方式执行此操作,您应该担心的是菜单是否有是否已初始化。