2015-10-17 28 views
5

AGGIORNAMENTO: sembra che quando si utilizza l'app, in alcuni momenti casuali, l'app si arresta in modo anomalo quando faccio un lungo clic, soprattutto sugli elementi verso la parte inferiore dello schermo. Qualche idea sul perché potrebbe essere?espresso lungo clic sulla voce di menu e menu popup

Quindi c'è una lista nella mia app. Se si esegue il longclick di un oggetto listview, viene visualizzato un menu popup, ancorato a quell'elemento che si è interrotto da molto tempo, con le opzioni per eliminare o modificare la voce di menu. Basta usare l'app, tutto funziona perfettamente. È possibile fare a lungo clic su qualsiasi elemento nell'elenco, i dati associati sottostanti vengono eliminati e il listview viene aggiornato senza quell'elemento che hai appena eliminato.

Quello che sto cercando di fare: Espresso non mi piace la visualizzazione elenco e il clic lungo però. Sto semplicemente cercando di verificare che il menu popup appaia, ma non riesco nemmeno a convincere l'espresso a longclick con successo. Sto pensando che il problema abbia qualcosa a che fare con il menu popup. Quindi, per i principianti, sto solo cercando di preparare l'espresso a longclick senza arrabbiarmi. Una volta che l'espresso procede con successo, penso di poter capire come controllare se il popup è visualizzato o meno.

Quello che ho provato finora: Ho letto che spegnere le animazioni dovrebbe aiutare l'espresso ad essere meno squilibrato. Ho spento tutte le animazioni che potevo e il problema persiste ancora. Posso anche vedere la prova di funzionamento sul mio telefono e vedere che è longclicking la voce di menu corretta, ma quando il longclick è completo e deve apparire il menu a comparsa, il test fallisce

codice: Si tratta di test di caffè espresso linea che fallisce. Ho usato la stessa riga di codice prima tranne con click() e l'app fa quello che deve e l'espresso è felice. mCourseCount è semplicemente l'indice dell'ultimo elemento nell'elenco. Questo non è il problema. Io e aggiorno lo stesso indice in molti altri test e tutto funziona bene.

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

In caso di guasto, esistono un paio di linee interessanti nella traccia dello stack

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' 

e più tardi

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) 

Questo ultimo pezzo della traccia dello stack è confusa perché ho sicuramente impostato il menu popup con un'ancora come segue (questo è da CourseMenuFragment attorno alla riga 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; 
     } 
    }); 

Nella riga in cui il popup viene prima istanziato, listView.getChildAt(position) definire l'ancoraggio per il menu popup. Forse c'è un problema con questo? Ma come detto, tutto funziona perfettamente come previsto quando si interagisce solo con me stesso.

Qualsiasi consiglio sarebbe apprezzato. Per favore fatemi sapere se sono necessari ulteriori chiarimenti.

+0

questo potrebbe aiutare: http://stackoverflow.com/questions/24634136/menu-popup-helper-cannot-be-used-without-anchor –

risposta

3

Soluzione trovata. Stavo accedendo alle voci dell'elenco in modo errato. Invece di

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

ho cambiato

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

ho dovuto regolare l'indice della posizione per quando mi è stato fatto scorrere verso il basso più lontano nella lista.Odio rispondere alle mie domande su SO, ma forse questo aiuterà qualcun altro.

Problemi correlati