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?

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()); 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.