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

时间:2016-02-26 18:51:38

标签: android view reference 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);
    }
}

以上代码有效。

是否可以在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 [])'   参考

2 个答案:

答案 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

`