2016-02-26 47 views
4

我使用MaterialShowcaseView向用戶顯示第一次啓動應用程序時的快速教程。Android獲取對操作欄項目的查看引用?

我遇到的問題是,當用戶選擇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也沒有成功。

我應該提到的是,我使用的是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: Attempt to invoke virtual method 'void android.view.View.getLocationInWindow(int[])' on a null object reference

+0

請檢查是否你的菜單項仍然是空內'onPrepareOptionsMenu '?同時粘貼發生異常的行號 –

+0

在.setTarget(mi.getActionView())時發生異常。並且菜單不爲空。 – Adz

+0

在我的答案中檢查我的編輯。我已經給出了一個關於圖書館如何在actiobar物品上使用它的代碼。 –

回答

4

你可以做menu.findItem(R.id.youritemid)拿到菜單,並且可以在onCreateOptionsMenu(Menu menu)方法中獲得對菜單對象的引用,然後可以使用該菜單對象初始化一個全局變量,以便在任何地方使用它。

下面是一些代碼:

@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);任何。

編輯: 請照顧時生成菜單之前你是不是調用菜單項什麼,你可以安排一個線程等待3至5秒,或者你可以做一些其他的方式,你應該擔心菜單是否已經初始化。

+0

嗨,你能告訴我你是如何「 d在代碼中執行此操作嗎?謝謝 – Adz

+0

我添加了一些代碼 –

+0

我在_menu.findItem(R.id.my_item)上得到了null對象引用; – Adz

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

`

相關問題