2017-06-13 4 views
2

Ich versuche, TapTargetView für die Menüelemente zu verwenden, aber ich kann nicht die Ansicht davon erhalten.Get MenuItems Referenz für TapTargetView anzeigen

Mein Code:

@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; 
} 

Fehler:

java.lang.IllegalArgumentException: Given null view to target

Wie kann ich dieses Problem beheben? Ich habe versucht, android:actionViewClass zu XML-Datei hinzuzufügen, aber kein Glück.

Antwort

1

Verwenden TapTarget.forToolbarMenuItem insted TapTarget.forView

Ändern Sie den Code wie folgt ..

@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

Sie können View#findViewsWithText() API verwenden, um die Referenz von MenuItem zu erhalten.

folgenden Eigenschaften als Menü 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> 

Und unter der Annahme, dass MenuItem angezeigt wird, dann:

@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); 
    }); 
} 
Verwandte Themen