espresso 长按菜单项和弹出菜单
espresso long click on menu item and popup menu
更新: 似乎只是在使用应用程序时,在某些随机时间,当我长按时应用程序会崩溃,尤其是在屏幕底部的项目上。关于为什么会这样有什么想法吗?
所以我的应用程序中有一个列表视图。如果您长按一个列表视图项目,则会出现一个弹出菜单,锚定到您长按的那个项目,并带有删除或编辑菜单项的选项。只需使用该应用程序,一切正常。您可以长按列表中的任何项目,底层关联数据将被删除,并且列表视图将刷新,而不会删除您刚刚删除的项目。
我正在尝试做什么:
Espresso 不喜欢我的列表视图和长按。我只是想测试弹出菜单是否出现,但我什至无法成功地长按浓缩咖啡。我认为这个问题与弹出菜单有关。因此,对于初学者来说,我只是想在不生我的气的情况下长按 Espresso。一旦 espresso longclicks 成功,我想我可以弄清楚如何检查弹出窗口是否显示。
到目前为止我已经尝试过的方法:我读到关闭动画应该有助于浓缩咖啡不那么不稳定。我关闭了我能关闭的所有动画,但问题仍然存在。我什至可以在我的 phone 上观看测试 运行 并看到它长按正确的菜单项,但是当长按完成并且应该出现弹出菜单时,测试失败
代码:
这是失败的浓缩咖啡测试线。除了 click()
之外,我之前使用过相同的代码行,并且该应用程序执行了它应该执行的操作并且浓缩咖啡很开心。 mCourseCount 只是列表中最后一项的索引。那不是问题。我在其他几个测试中更新了相同的索引,一切正常。
onData(anything()).inAdapterView(withId(R.id.listview_class))
.atPosition(mCourseCount).perform(longClick());
失败后,堆栈跟踪中存在几行有趣的行
android.support.test.espresso.PerformException: Error performing 'long
click' on view ' displaying data matching: ANYTHING within adapter vieW
matching: with id: com.cmsc355.classcompass.classcompass:id/listview_class'
以后
Caused by: java.lang.IllegalStateException: MenuPopupHelper cannot be used
without an anchor at
com.android.internal.view.menu.MenuPopupHelper.show(MenuPopupHelper.java:101)
at android.widget.PopupMenu.show(PopupMenu.java:108)at
com.cmsc355.classcompass.classcompass.CourseMenuFragment.
onItemLongClick(CourseMenuFragment.java:91)
堆栈跟踪的最后一点令人困惑,因为我明确地设置了带有锚点的弹出菜单,如下所示(这是来自第 91 行附近的 CourseMenuFragment):
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, final View view, final int position, long id) {
PopupMenu popupEdit = new PopupMenu(getActivity(), listView.getChildAt(position));
popupEdit.getMenuInflater().inflate(R.menu.course_longclick_popup, popupEdit.getMenu());
popupEdit.show();
popupEdit.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
if (item.getItemId() == R.id.edit_course) {
} else if (item.getItemId() == R.id.delete_course) {
throwCourseDeleteAlert(position);
listView.setAdapter(mCourseNameAdapter);
}
return true;
}
});
return true;
}
});
在首次实例化弹出窗口的行中,listView.getChildAt(position)
定义弹出菜单的锚点。也许这有问题?但如前所述,仅与我自己互动时,一切都按预期完全正常工作。
如有任何指导,我们将不胜感激。如果需要进一步说明,请告诉我。
找到解决方案。我错误地访问了列表项。而不是
PopupMenu popupEdit = new PopupMenu(getActivity(), listView.getChildAt(position));
我改成了
PopupMenu popupEdit = new PopupMenu(getActivity(), listView.getChildAt(position - listView.getFirstVisiblePosition()));
当我在列表中向下滚动时,我不得不调整位置索引。我有点讨厌在 SO 上回答我自己的问题,但也许这会对其他人有所帮助。
更新: 似乎只是在使用应用程序时,在某些随机时间,当我长按时应用程序会崩溃,尤其是在屏幕底部的项目上。关于为什么会这样有什么想法吗?
所以我的应用程序中有一个列表视图。如果您长按一个列表视图项目,则会出现一个弹出菜单,锚定到您长按的那个项目,并带有删除或编辑菜单项的选项。只需使用该应用程序,一切正常。您可以长按列表中的任何项目,底层关联数据将被删除,并且列表视图将刷新,而不会删除您刚刚删除的项目。
我正在尝试做什么: Espresso 不喜欢我的列表视图和长按。我只是想测试弹出菜单是否出现,但我什至无法成功地长按浓缩咖啡。我认为这个问题与弹出菜单有关。因此,对于初学者来说,我只是想在不生我的气的情况下长按 Espresso。一旦 espresso longclicks 成功,我想我可以弄清楚如何检查弹出窗口是否显示。
到目前为止我已经尝试过的方法:我读到关闭动画应该有助于浓缩咖啡不那么不稳定。我关闭了我能关闭的所有动画,但问题仍然存在。我什至可以在我的 phone 上观看测试 运行 并看到它长按正确的菜单项,但是当长按完成并且应该出现弹出菜单时,测试失败
代码:
这是失败的浓缩咖啡测试线。除了 click()
之外,我之前使用过相同的代码行,并且该应用程序执行了它应该执行的操作并且浓缩咖啡很开心。 mCourseCount 只是列表中最后一项的索引。那不是问题。我在其他几个测试中更新了相同的索引,一切正常。
onData(anything()).inAdapterView(withId(R.id.listview_class))
.atPosition(mCourseCount).perform(longClick());
失败后,堆栈跟踪中存在几行有趣的行
android.support.test.espresso.PerformException: Error performing 'long
click' on view ' displaying data matching: ANYTHING within adapter vieW
matching: with id: com.cmsc355.classcompass.classcompass:id/listview_class'
以后
Caused by: java.lang.IllegalStateException: MenuPopupHelper cannot be used
without an anchor at
com.android.internal.view.menu.MenuPopupHelper.show(MenuPopupHelper.java:101)
at android.widget.PopupMenu.show(PopupMenu.java:108)at
com.cmsc355.classcompass.classcompass.CourseMenuFragment.
onItemLongClick(CourseMenuFragment.java:91)
堆栈跟踪的最后一点令人困惑,因为我明确地设置了带有锚点的弹出菜单,如下所示(这是来自第 91 行附近的 CourseMenuFragment):
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, final View view, final int position, long id) {
PopupMenu popupEdit = new PopupMenu(getActivity(), listView.getChildAt(position));
popupEdit.getMenuInflater().inflate(R.menu.course_longclick_popup, popupEdit.getMenu());
popupEdit.show();
popupEdit.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
if (item.getItemId() == R.id.edit_course) {
} else if (item.getItemId() == R.id.delete_course) {
throwCourseDeleteAlert(position);
listView.setAdapter(mCourseNameAdapter);
}
return true;
}
});
return true;
}
});
在首次实例化弹出窗口的行中,listView.getChildAt(position)
定义弹出菜单的锚点。也许这有问题?但如前所述,仅与我自己互动时,一切都按预期完全正常工作。
如有任何指导,我们将不胜感激。如果需要进一步说明,请告诉我。
找到解决方案。我错误地访问了列表项。而不是
PopupMenu popupEdit = new PopupMenu(getActivity(), listView.getChildAt(position));
我改成了
PopupMenu popupEdit = new PopupMenu(getActivity(), listView.getChildAt(position - listView.getFirstVisiblePosition()));
当我在列表中向下滚动时,我不得不调整位置索引。我有点讨厌在 SO 上回答我自己的问题,但也许这会对其他人有所帮助。