使用Espresso在NavigationView中选择项目

3
我有这段代码
 private void setupDrawerLayout() {
    navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(MenuItem menuItem) {

            final int itemId = menuItem.getItemId();

            switch (itemId) {
                case R.id.drawer_my_mixes:
                    replaceFragment(MyMixesFragment.newInstance());
                    drawerLayout.closeDrawers();
                    break;
                   and so on...

我想要通过点击R.id.drawer_settings来制作浓缩咖啡,这将基本上打开一个名为SettingsFragment的片段。我该怎么做?我尝试过但没有成功。

private ViewInteraction navigateToSettings(){
    openActionBarOverflowOrOptionsMenu(getInstrumentation().getTargetContext());
    return onView(withText("Settings")).perform(click());

}
4个回答

4

1
在 Espresso 2 中,你可以使用 onView(withId(R.id.drawer_layout)).perform(DrawerActions.open());。更多信息请查看 这个答案 - MiguelHincapieC

1

openActionBarOverflowOrOptionsMenu()无法打开NavigationView。

对我来说,以下内容有效:

//Open NavigationView
Matcher<View> isImageButton = withClassName(is(ImageButton.class.getName()));
Matcher<View> isInToolbar = isDescendantOfA(withId(R.id.toolbar));
onView(allOf(isInToolbar, isImageButton)).perform(click());

//Click on item in NavigationView
onView(withText(R.string.logout)).perform(click());

这个解决方案对我来说是临时的,直到像用户40797建议的更好的解决方案可用...


0

参考MiguelHincapieC的回答,以下是我成功使用的方法:

onView(withId(R.id.drawer_layout)).perform(DrawerActions.open());

希望这有所帮助 :)。

0

如何在NavigationView中选择一个项目。

在您的utils包中:

public class NavigationViewTestHelper {

    public static Matcher<View> childAtPosition(
            final Matcher<View> parentMatcher, final int position) {

        return new TypeSafeMatcher<View>() {
            @Override
            public void describeTo(Description description) {
                description.appendText("Child at position " + position + " in parent ");
                parentMatcher.describeTo(description);
            }

            @Override
            public boolean matchesSafely(View view) {
                ViewParent parent = view.getParent();
                return parent instanceof ViewGroup && parentMatcher.matches(parent)
                        && view.equals(((ViewGroup) parent).getChildAt(position));
            }
        };
    }
}

在打开NavigationView后进行测试。

ViewInteraction navigationMenuItemView = onView(
                allOf(childAtPosition(
                        allOf(withId(R.id.design_navigation_view),
                                childAtPosition(
                                        withId(R.id.*your_navigation_view_id*),
                                        0)),
                        1), // Position of the element in the Navigation view.
                        isDisplayed()));

navigationMenuItemView.perform(click());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接