Haga clic en el elemento de menú que se encuentra a veces en el menú de desbordamiento
Actualmente para hacer clic en menú-elemento que a veces se encuentra en algunos dispositivos en el menú de desbordamiento Estoy haciendo lo siguiente:
fun invokeMenu(@IdRes menuId: Int, @StringRes menuStringRes: Int) { try { onView(withId(menuId)).perform(click()) } catch (nmv: NoMatchingViewException) { openActionBarOverflowOrOptionsMenu(InstrumentationRegistry.getInstrumentation().targetContext) onView(withText(menuStringRes)).perform(click()) } }
Pero estoy buscando un mejor enfoque – idealmente algo donde sólo tengo que saber el menú-id. ¿Cómo haces esto en tus exámenes?
- Android: OptionMenu entre Actividad y Fragmentos
- ¿Cómo crearía un Spinner para su uso como elemento de acción?
- Mostrar elemento de menú siempre en la barra de acción de soporte
- Icono de imagen con el elemento de menú Opción de barra de acción
- No se puede ocultar el teclado virtual de SearchView iconfiedbydefault (false)
- ¿Por qué ActionbarSharelock muestra sólo el icono de desbordamiento incluso hay espacio
- Detección de un clic en el botón de la barra de acción de nuevo - (OnOptionsItemSelected no llamar cuando haga clic en el botón de la barra de acción de vuelta)
- Configuración de la descripción del contenido del menú de opciones android Talkback
- Cambiar el color del texto del menú de opciones cuando usamos app: showAsAction = "always"
- Haciendo clic en un elemento de menú en la barra de acción con Espresso al usar onView (withId (...))
- Cómo ocultar el menú de opciones?
Desafortunadamente, su caso ideal no puede ser cumplido. Esto se debe a la construcción de bibliotecas de apoyo.
Comencemos desde PopupMenu
, que tiene una referencia a MenuPopupHelper
, que tiene referencia a MenuPopup
. Esta es una clase abstracta extendida es decir. Por StandardMenuPopup
. Tiene referencia a MenuAdapter
. Si miras en la línea 92 de MenuAdapter
verás, la línea:
itemView.initialize(getItem(position), 0);
Esta es la invocación clave del método. Se puede invocar en ActionMenuItemView
o ListMenuItemView
. Sus implementaciones difieren en el caso, que se adjunta a ActionMenuItemView , y no está conectado a ListMenuItemView
Además, MenuAdapter.getItemId(int position)
devuelve la position
justa. El ID del elemento de menú se pierde en el menú de desbordamiento.
Hovewer, su código se puede simplificar a un trazador de líneas. Definir una función:
public static Matcher<View> withMenuIdOrText(@IdRes int id, @StringRes int menuText) { Matcher<View> matcher = withId(id); try { onView(matcher).check(matches(isDisplayed())); return matcher; } catch (Exception NoMatchingViewException) { openActionBarOverflowOrOptionsMenu(InstrumentationRegistry.getInstrumentation().getTargetContext()); return withText(menuText); } }
Uso:
onView(withMenuIdOrText(R.id.menu_id, R.string.menu_text)).perform(click());