web-dev-qa-db-fra.com

Comment obtenir une vue depuis Espresso pour passer dans un IdlingResource?

J'ai essentiellement une coutume IdlingResource qui prend un View un argument constructeur. Je ne trouve aucun endroit qui parle réellement de la façon de le mettre en œuvre.

J'essaie d'utiliser cette réponse: https://stackoverflow.com/a/32763454/1193321

Comme vous pouvez le constater, il faut une ViewPager, mais lorsque j'inscris IdlingResource dans ma classe de test, je ne sais pas comment obtenir mon point de vue.

J'ai essayé findViewById() et j'ai essayé d'obtenir l'activité en cours puis d'appeler findViewById() à ce sujet, sans succès. 

Quelqu'un sait quoi faire dans ce scénario?

19
EGHDK

Deviner. Pour que la vue passe dans une ressource inactive, il vous suffit de prendre la variable membre de votre ActivityTestRule.

Par exemple:

@Rule
public ActivityTestRule<MainActivity> activityTestRule = new ActivityTestRule<>(
        MainActivity.class);

puis appelez simplement getActivity().findViewById(R.id.viewId)

Le résultat final est donc:

activityTestRule.getActivity().findViewById(R.id.viewId);
26
EGHDK

La réponse acceptée fonctionne tant qu'un test est en cours dans la même activité. Cependant, si le test passe à une autre activité, activityTestRule.getActivity() renverra la mauvaise activité (la première). Pour résoudre ce problème, on peut créer une méthode d'assistance renvoyant une activité réelle:

public Activity getCurrentActivity() {
    final Activity[] currentActivity = new Activity[1];
    InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
        @Override
        public void run() {
            Collection<Activity> allActivities = ActivityLifecycleMonitorRegistry.getInstance()
                    .getActivitiesInStage(Stage.RESUMED);
            if (!allActivities.isEmpty()) {
                currentActivity[0] = allActivities.iterator().next();
            }
        }
    });
    return currentActivity[0];
}

Et puis, il pourrait être utilisé comme suit:

Activity currentActivity = getCurrentActivity();
if (currentActivity != null) {
    currentActivity.findViewById(R.id.viewId);
}
8
Anatolii

Je n'ai pas encore utilisé IdilingResources dans Espresso, mais avez-vous vu ces articles:

Consultez également les documents Android officiels: Idling Resources (référence)

Pour répondre à ta question, 

Voici un exemple tiré d'un lien ci-dessus:

En commençant par un contexte, la vue racine du fichier activité associée peut être eu par

View rootView = ((Activity)_context).Window.DecorView.FindViewById(Android.Resource.Id.Content);

Dans Raw Android, cela ressemblerait à quelque chose comme:

View rootView = ((Activity)mContext).getWindow().getDecorView().findViewById(Android.R.id.content)

Ensuite, appelez simplement findViewById sur cette

View v = rootView.findViewById(R.id.your_view_id);

Cela pourrait aussi être utile: Comment appeler getResources () depuis une classe qui n’a pas de contexte?

J'espère que ça aide

1
piotrek1543