Martynas Jurkus Martynas Jurkus - 10 days ago 8
Android Question

Android Espresso typeText into EditText in ActionBar

I have a

SearchView
in my ActionBar that is inflated from XML

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/action_menu_search"
android:showAsAction="always|collapseActionView"
android:icon="@drawable/action_bar_search_icon"
android:actionViewClass="android.widget.SearchView"/>
</menu>


I inflate it in my Fragment this way:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.search, menu);

final MenuItem item = menu.findItem(R.id.action_menu_search);
searchView = (SearchView) item.getActionView();
searchView.setOnQueryTextListener(this);
}


And my test:

onView(withId(R.id.catalog_filter_indicator_header_text)).perform(click());

//enter text and wait for suggestions
onView(withId(R.id.action_menu_search)).perform(click());
onViewisAssignableFrom(AutoCompleteTextView.class)).perform(click(), typeText("test"));


It looks like that field looses focus when it starts typing. And I don't know why.

All views are found and
typeText
statement passes without a hitch, but text does not appear in the field. I also tried that with simple
EditText
and custom
android:actionLayout
but with the same results.

Is there something I'm missing?

Answer

Finally, I decided to create my own custom action because I wasn't be able to typeText work. Here you are my code:

public static ViewAction setText(final String text){
    return new ViewAction(){
        @Override
        public Matcher<View> getConstraints() {
            return allOf(isDisplayed(), isAssignableFrom(TextView.class));
        }

        @Override
        public String getDescription() {
            return "Change view text";
        }

        @Override
        public void perform(UiController uiController, View view) {
            ((TextView) view).setText(text);
        }
    };
}

This code is useful to write code in all children from TextView. F. ex, EditText.

I took this code from http://stackoverflow.com/a/32850190/1360815