java - support - test ui android
¿Cómo obtener una vista desde Espresso para pasar a un IdlingResource? (3)
La respuesta aceptada funciona siempre que una prueba se ejecute en la misma actividad. Sin embargo, si la prueba navega a otra actividad, activityTestRule.getActivity()
devolverá la actividad incorrecta (la primera). Para solucionar esto, uno puede crear un método auxiliar que devuelva una actividad real:
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];
}
Y luego podría ser utilizado como el siguiente:
Activity currentActivity = getCurrentActivity();
if (currentActivity != null) {
currentActivity.findViewById(R.id.viewId);
}
Básicamente, tengo un IdlingResource
personalizado que toma un argumento View
un constructor. No puedo encontrar ningún lugar que realmente hable sobre cómo implementarlo.
Estoy tratando de usar esta respuesta: https://stackoverflow.com/a/32763454/1193321
Como puede ver, se necesita un ViewPager
, pero cuando estoy registrando el IdlingResource
en mi clase de prueba, no estoy seguro de cómo puedo obtener mi vista.
He intentado findViewById()
y he intentado obtener la actividad actualmente en ejecución y luego llamar a findViewById()
sobre eso, sin suerte.
¿Alguien sabe qué hacer en este escenario?
Lo averigué. Para que la vista pase a un recurso inactivo, todo lo que tiene que hacer es tomar la variable miembro de su ActivityTestRule
Por ejemplo:
@Rule
public ActivityTestRule<MainActivity> activityTestRule = new ActivityTestRule<>(
MainActivity.class);
y luego simplemente llame a getActivity().findViewById(R.id.viewId)
Entonces el resultado final es:
activityTestRule.getActivity().findViewById(R.id.viewId);
No he usado IdilingResources
en Espresso
, pero viste estos artículos:
- Espresso: Custom Idling Resource de Chiuki
- Espérelo ... una inmersión profunda en los recursos de ralentí de Espresso
También por favor verifique los documentos oficiales de Android: Recursos de ralentí (referencia)
Para responder tu pregunta,
La mejor manera de hacerlo es pasar una instancia de una de las Vistas al constructor de la clase. Marque: Llamar a findViewById () desde fuera de una actividad
Otra forma es obtener vista por contexto. Check android - ¿Cómo obtener una vista desde el contexto?
Aquí hay un ejemplo tomado de un enlace de arriba:
A partir de un contexto, la vista raíz de la actividad asociada se puede tener por
View rootView = ((Activity)_context).Window.DecorView.FindViewById(Android.Resource.Id.Content);
En Raw Android se vería algo así como:
View rootView = ((Activity)mContext).getWindow().getDecorView().findViewById(android.R.id.content)
Entonces simplemente llame al findViewById en este
View v = rootView.findViewById(R.id.your_view_id);
Esto también podría ser útil: ¿Cómo llamar a getResources () desde una clase que no tiene contexto?
Espero te ayude