espresso长按菜单项和弹出菜单

时间:2015-10-17 12:39:37

标签: android listview android-espresso

更新:似乎只是在使用应用程序时,在某些随机时间,应用程序会在长时间点击时崩溃,尤其是在屏幕底部的项目上。关于为什么会这样的任何想法?

所以我的应用程序中有一个列表视图。如果您单击列表视图项目,则会出现一个弹出菜单,该菜单锚定到您已经长时间点击的项目,并显示删除或编辑菜单项的选项。只需使用该应用程序,一切正常。您可以长按列表中的任何项目,删除基础关联数据,并刷新列表视图,而不刷新您刚刚删除的项目。

我想做的事情: Espresso不喜欢我的列表视图和长按。我只是试图测试弹出菜单出现,但我甚至无法成功地获得浓缩咖啡。我认为这个问题与弹出菜单有关。所以对于初学者来说,我只是试图让浓缩咖啡变成longclick,而不会让我感到沮丧。一旦espresso成功点击,我想我可以弄清楚如何检查弹出窗口是否显示。

到目前为止我尝试过的事情:我读到关闭动画应该可以帮助浓缩咖啡变得不那么脆弱。我关掉了所有的动画,问题仍然存在。我甚至可以在手机上观看测试运行并看到它正在长按正确的菜单项,但是当完成longclick并且弹出菜单出现时,测试失败

的: 这是espresso测试线失败。除了使用click()之外,我之前使用了相同的代码行,并且应用程序执行了它应该执行的操作,espresso很高兴。 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$2.
 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)定义弹出菜单的锚点。也许这有问题吗?但正如所提到的,当与我自己互动时,一切都按照预期完全正常。

任何指导都将不胜感激。如果需要澄清,请告诉我。

1 个答案:

答案 0 :(得分:3)

找到解决方案。我正在错误地访问列表项。而不是

PopupMenu popupEdit = new PopupMenu(getActivity(), listView.getChildAt(position));

我改为

PopupMenu popupEdit = new PopupMenu(getActivity(), listView.getChildAt(position - listView.getFirstVisiblePosition()));

当我在列表中向下滚动时,我必须调整位置的索引。我讨厌在SO上回答我自己的问题,但也许这会帮助其他人。