2017-01-26 2 views
0

J'ai un test d'unité à faire et je dois cliquer sur un Textview qui est dans la première position d'une vue de recyler. J'ai ce codeCliquez sur une vue de texte dans RecyclerView avec Espresso

onView(withId(R.id.recyclerViewDevices)) 
       .perform(actionOnItemAtPosition(0, click())); 

mais je veux seulement cliquer dans le textView que le nom de « CONNECT » et non dans toute la position. Pouvez-vous m'aider?

+0

Je pense que vous devez utiliser onData et onChildView pour travailler avec des listes. https://google.github.io/android-testing-support-library/docs/espresso/basics/index.html#using-ondata-with-adapterview-controls-listview-gridview- – Christopher

+0

Copie possible de - http://stackoverflow.com/questions/28476507/using-espresso-to-click-view-inside-recyclerview-item – Dibzmania

Répondre

0

Vous pouvez y arriver avec un viewAction personnalisé

private class ClickOnTextView implements ViewAction { 

    ViewAction click = click(); 
    int textViewId; 

    public ClickOnTextView(int textViewId) { 
     this.textViewId = textViewId; 
    } 

    @Override 
    public Matcher<View> getConstraints() { 
     return click.getConstraints(); 

    } 

    @Override 
    public String getDescription() { 
     return " click on TextView with id: " + textViewId; 
    } 

    @Override 
    public void perform(UiController uiController, View view) { 
     click.perform(uiController, view.findViewById(textViewId)); 
    } 
} 

Puis changer votre code:

onView(withId(R.id.recyclerViewDevices)).perform(RecyclerViewActions.actionOnItemAtPosition(0, new ClickOnTextView(R.id.CONNECT))); 
+0

ViewAction click = clic(); cette ligne donne une erreur sur click(); – Jose

+0

Ajouter à vos importations: '' 'statiques d'importation android.support.test.espresso.action.ViewActions.click;' '' – Gustavo

+0

il ne se connecte pas. Il reste dans l'activité et ne fait rien: S – Jose

0

Utilisez ce morceau de code:

public static ViewAction clickChildViewWithId(final int id) { 
    return new ViewAction() { 
     @Override 
     public Matcher<View> getConstraints() { 
      return null; 
     } 

     @Override 
     public String getDescription() { 
      return "Click on a child view with specified id."; 
     } 

     @Override 
     public void perform(UiController uiController, View view) { 
      View v = view.findViewById(id); 
      v.performClick(); 
     } 
    }; 
} 

et l'utiliser comme ceci :

onView(allOf(withId(R.id.ID_OF_RECYCLERVIEW), isDisplayed())).perform(RecyclerViewActions.actionOnItemAtPosition(POSITION_IN_RECYCLERVIEW, clickChildViewWithId(R.id.ID_OF_TEXTVIEW)));