select 项 NavigationView 与 Espresso
select item in NavigationView with Espresso
我有这段代码
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());
}
正确的方法是使用 Espresso 的 onData 函数。
onData(allOf(is(instanceOf(NavigationMenuItem.class)), ... )).perform(click());
但是无法访问 NavigationMenuItem,因为它是私有嵌套 class。
一个问题正在等待https://code.google.com/p/android/issues/detail?id=187701寻找解决方案。给它加一颗星 ;-)
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());
此解决方案暂时对我有用,直到 user40797 建议的更好的解决方案起作用为止...
如何 select NavigationView 中的项目。
在您的包实用程序中:
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());
我有这段代码
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());
}
正确的方法是使用 Espresso 的 onData 函数。
onData(allOf(is(instanceOf(NavigationMenuItem.class)), ... )).perform(click());
但是无法访问 NavigationMenuItem,因为它是私有嵌套 class。
一个问题正在等待https://code.google.com/p/android/issues/detail?id=187701寻找解决方案。给它加一颗星 ;-)
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());
此解决方案暂时对我有用,直到 user40797 建议的更好的解决方案起作用为止...
如何 select NavigationView 中的项目。
在您的包实用程序中:
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());