2017-06-13 32 views
2

我嘗試使用TapTargetView作爲菜單項,但我無法獲得它的視圖。獲取MenuItem的TapTargetView的查看參考

我的代碼:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater menuInflater = getMenuInflater(); 
    menuInflater.inflate(R.menu.menu, menu); 

    new TapTargetSequence(this) 
      .targets(
        TapTarget.forView(menu.findItem(R.id.add).getActionView(), "Gonna")) 

      .listener(new TapTargetSequence.Listener() { 
       // This listener will tell us when interesting(tm) events happen in regards 
       // to the sequence 
       @Override 
       public void onSequenceFinish() { 
        // Yay 
       } 

       @Override 
       public void onSequenceStep(TapTarget lastTarget, boolean targetClicked) { 

       } 


       @Override 
       public void onSequenceCanceled(TapTarget lastTarget) { 
        // Boo 
       } 
      }); 


    return true; 
} 

錯誤:

java.lang.IllegalArgumentException: Given null view to target

我怎樣才能解決這個問題? 我已經嘗試將android:actionViewClass添加到xml文件,但沒有運氣。

回答

1

使用TapTarget.forToolbarMenuItem insted的TapTarget.forView

更改代碼這樣的.. 。

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
MenuInflater menuInflater = getMenuInflater(); 
menuInflater.inflate(R.menu.menu, menu); 

new TapTargetSequence(this) 
     .targets(
       TapTarget.forToolbarMenuItem(toolbar,R.id.add, "Gonna")) 

     .listener(new TapTargetSequence.Listener() { 
      // This listener will tell us when interesting(tm) events happen in regards 
      // to the sequence 
      @Override 
      public void onSequenceFinish() { 
       // Yay 
      } 

      @Override 
      public void onSequenceStep(TapTarget lastTarget, boolean targetClicked) { 

      } 


      @Override 
      public void onSequenceCanceled(TapTarget lastTarget) { 
       // Boo 
      } 
     }); 


return true; 
} 
0

您可以利用View#findViewsWithText() API獲取MenuItem的查看參考。

有以下作爲菜單的xml

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto"> 
    <item android:id="@+id/action_settings" 
     android:title="@string/action_settings" 
     android:orderInCategory="100" 
     app:showAsAction="ifRoom"/> 
</menu> 

並假設MenuItem正在顯示,則:

@Override protected void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    final View decorView = getWindow().getDecorView(); 

    decorView.post(() -> { 
    ArrayList<View> list = new ArrayList<>(); 
    decorView.findViewsWithText(list, getString(R.string.action_settings), View.FIND_VIEWS_WITH_TEXT); 
    // `itemView` is the actual view you should use to create your `TapTargetView` 
    View itemView = list.get(0); 
    }); 
}