2015-10-17 3 views
5

UPDATE: es scheint, dass wenn die App nur zu einigen zufälligen Zeiten, die App wird abstürzen, wenn ich lange klicke, vor allem auf Elemente auf der Unterseite des Bildschirms. Irgendwelche Ideen, warum das sein könnte?espresso lange klick auf menü item und popup menü

So gibt es eine Listenansicht in meiner App. Wenn Sie auf ein Listenansichtselement klicken, wird ein Popup-Menü angezeigt, das mit dem Objekt verknüpft ist, auf das Sie lange geklickt haben. Es enthält Optionen zum Löschen oder Bearbeiten des Menüelements. Mit der App funktioniert alles gut. Sie können auf ein beliebiges Element in der Liste klicken, die zugrunde liegenden verknüpften Daten werden gelöscht und die Listenansicht wird ohne das Element aktualisiert, das Sie gerade gelöscht haben.

Was ich versuche zu tun: Espresso mag nicht meine Listenansicht und langes Klicken obwohl. Ich versuche nur zu testen, dass das Popup-Menü erscheint, aber ich kann nicht einmal Espresso erfolgreich mit einem langen Klick starten. Ich denke, das Problem hat etwas mit dem Popup-Menü zu tun. Also für den Anfang versuche ich nur, Espresso zum Longclick zu bekommen, ohne sich über mich zu ärgern. Sobald Espresso-Longclicks erfolgreich sind, denke ich, kann ich herausfinden, ob das Popup angezeigt wird oder nicht.

Was ich bis jetzt versucht habe: Ich habe gelesen, dass das Ausschalten von Animationen soll Espresso weniger flockig sein. Ich habe alle Animationen ausgeschaltet und das Problem besteht immer noch. Ich kann sogar den Testlauf auf meinem Handy beobachten und sehen, dass es den richtigen Menüpunkt ist longclicking, aber wenn die longclick abgeschlossen ist und das Popup-Menü angezeigt werden soll, schlägt der Test fehl

Code: Dies ist Espresso-Test Zeile, die fehlschlägt. Ich habe die gleiche Codezeile zuvor verwendet, außer mit click() und die App macht was es soll und Espresso ist glücklich. mCourseCount ist einfach der Index des letzten Eintrags in der Liste. Das ist nicht das Problem. Ich und aktualisieren Sie den gleichen Index in mehreren anderen Tests und alles funktioniert gut.

onData(anything()).inAdapterView(withId(R.id.listview_class))  
     .atPosition(mCourseCount).perform(longClick()); 

Bei einem Ausfall, gibt es ein paar interessanten Zeilen in dem Stack-Trace

android.support.test.espresso.PerformException: Error performing 'long 
click' on view ' displaying data matching: ANYTHING within adapter vieW 
matching: with id: com.cmsc355.classcompass.classcompass:id/listview_class' 

und später

Caused by: java.lang.IllegalStateException: MenuPopupHelper cannot be used 
without an anchor at 
com.android.internal.view.menu.MenuPopupHelper.show(MenuPopupHelper.java:101) 
at android.widget.PopupMenu.show(PopupMenu.java:108)at 
com.cmsc355.classcompass.classcompass.CourseMenuFragment$2. 
onItemLongClick(CourseMenuFragment.java:91) 

Das letzte Bit der Stack-Trace verwirrend ist, weil ich auf jeden Fall eingestellt Führen Sie das Popup-Menü mit einem Anker wie folgt (dies ist von CourseMenuFragment um Linie 91):

listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 
     @Override 
     public boolean onItemLongClick(AdapterView<?> parent, final View view, final int position, long id) { 

     PopupMenu popupEdit = new PopupMenu(getActivity(), listView.getChildAt(position)); 
     popupEdit.getMenuInflater().inflate(R.menu.course_longclick_popup, popupEdit.getMenu()); 
     popupEdit.show(); 

     popupEdit.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { 
      @Override 
      public boolean onMenuItemClick(MenuItem item) { 

      if (item.getItemId() == R.id.edit_course) { 

      } else if (item.getItemId() == R.id.delete_course) { 
       throwCourseDeleteAlert(position); 
       listView.setAdapter(mCourseNameAdapter); 
      } 
      return true; 
      } 
     }); 
     return true; 
     } 
    }); 

In der Zeile, in der das Popup zuerst instanziiert wird, definieren listView.getChildAt(position) den Anker für das Popup-Menü. Vielleicht gibt es ein Problem damit? Aber wie gesagt, alles funktioniert wie erwartet, wenn ich nur mit mir selbst interagiere.

Jede Anleitung wäre willkommen. Bitte lassen Sie mich wissen, wenn weitere Klärung erforderlich ist.

+0

das könnte helfen: http://StackOverflow.com/Questions/24634136/menu-popup-helper-cannot-be-verwendet-ohne-anchor –

Antwort

3

Gefundene Lösung. Ich habe falsch auf die Listenelemente zugegriffen. Statt

PopupMenu popupEdit = new PopupMenu(getActivity(), listView.getChildAt(position)); 

I geändert

PopupMenu popupEdit = new PopupMenu(getActivity(), listView.getChildAt(position - listView.getFirstVisiblePosition())); 

Ich musste den Index der Position einzustellen, um, wenn ich weiter in der Liste nach unten gescrollt.Ich hasse es irgendwie, meine eigenen Fragen zu SO zu beantworten, aber vielleicht hilft das jemand anderem.