草庐IT

android - espresso 长按菜单项和弹出菜单

coder 2023-12-14 原文

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

所以我的应用程序中有一个 ListView 。如果您长按一个 ListView 项目,则会出现一个弹出菜单,锚定到您长按的那个项目,并带有删除或编辑菜单项的选项。只需使用该应用程序,一切正常。您可以长按列表中的任何项目,底层关联数据将被删除,并且 ListView 会刷新,但不会显示您刚刚删除的项目。

我想做什么: Espresso 不喜欢我的 ListView 和长按。我只是想测试弹出菜单是否出现,但我什至无法成功地长按 Espresso 。我认为这个问题与弹出菜单有关。因此,对于初学者来说,我只是想在不生我的气的情况下长按 Espresso。一旦 espresso 长按成功,我想我可以弄清楚如何检查弹出窗口是否显示。

到目前为止我尝试过的方法:我读到关闭动画应该有助于 Espresso 不那么不稳定。我关闭了我能关闭的所有动画,但问题仍然存在。我什至可以在我的手机上观看测试运行并看到它正在长按正确的菜单项,但是当长按完成并且应该出现弹出菜单时,测试失败了

代码: 这是失败的 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)

堆栈跟踪的最后一点令人困惑,因为我明确地设置了带有 anchor 的弹出菜单,如下所示(这是来自第 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) 定义弹出菜单的 anchor 。也许这有问题?但如前所述,仅与我自己互动时,一切都按预期完全正常工作。

任何指导将不胜感激。如果需要进一步说明,请告诉我。

最佳答案

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

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

我改成了

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

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

关于android - espresso 长按菜单项和弹出菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33186728/

有关android - espresso 长按菜单项和弹出菜单的更多相关文章

  1. ruby - 多次弹出/移动 ruby​​ 数组 - 2

    我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby​​数组,我们在StackOverflow上找到一

  2. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  3. ruby - Ruby 中的选项菜单 - 2

    我正在尝试在Ruby中创建一个菜单,以便根据用户输入的内容,取决于调用的类。然后在这种情况下它将返回到“Main”或类“Options”。我希望有人能帮助我。这是我的代码。modulePhysicsG=21C=20000Pi=3.14D=100endclassOptionsputs"Pleaseselect1forAccelerationand2forEnergy."option=gets()ifoption==1thenputs"AccelCalc"#ThisisthebitthatneedstodirecttheusertotheclassAccelCalcelseputs"Ene

  4. ruby - 下拉菜单在应该被选中的时候没有被选中……为什么? - 2

    我正在尝试解决我们测试中的一个错误,我认为它应该有效。我很确定这是selectize或capybara中的错误,但我不明白为什么。我已经进入了capybara的源代码,一切似乎都在正常工作。我真的不确定如何前进。为了测试这个错误,我已经尽可能地把这个错误剥离成一个小的testapplication.请参阅下面的设置bugs/show.html.erbOneTwoThreeFourOneTwoThreeFourbug_spec.rbfeature'bug'doit"specsetup",js:truedovisitbug_pathfind('div.selectize-inputinpu

  5. ruby - 处理在 keyup 事件上发生的 javascript 弹出窗口 - 2

    我在HTML页面上有一个文本字段,用于检查您是否输入了1到365之间的值。如果用户输入了无效值,如非数字字符或不在范围内的值,它显示一个弹出窗口。我在watirwiki上看到有一个select_no_wait方法,用于在您从列表中选择无效值时关闭弹出窗口。处理键盘事件时出现的弹出窗口的好方法是什么?我是否需要按照select_no_wait方法的实现方式进行操作,或者我们是否可以启动一个不同的进程来消除调用set方法时可能出现的弹出窗口。带有Javascript验证函数的HTML文件示例如下:varnum=0functionvalidate(e){varcharPressed=Stri

  6. ruby-on-rails - 在 Rails 中,如何使用字符串数组实现 HTML 选择菜单? - 2

    我有一个FinancialDocument#document_type模型属性。我想让用户从由字符串数组填充的HTML选择菜单中选择文档类型...doctypes=['Invoice','Packingslip','Other']对于每个选项,显示的标签和返回的值都是相同的。我查看了select和collection_select助手,但它们似乎适合选择子模型,而不仅仅是一个String值。我找不到如何让它们达到我的目的。这是我正在尝试的方法(我使用的是Haml,而不是Erb)...form_for(@financial_document)do|f|-doctypes=['Invoic

  7. ruby - 切换到 cucumber , capybara 中的弹出窗口 - 2

    在RSpec中我可以使用这样的代码切换到弹出窗口,link,我怎么能在cucumber步骤中做这样的事情?login_window=page.driver.find_window('PPA_identity_window')main_window=page.driver.find_window('')#Weusethistoexecutethenextinstructionsinthepopupwindowpage.within_window(login_window)do#Normallyfillintheformandloginfill_in'email',:with=>""fil

  8. Android Studio开发之使用内容组件Content获取通讯信息讲解及实战(附源码 包括添加手机联系人和发短信) - 2

    运行有问题或需要源码请点赞关注收藏后评论区留言一、利用ContentResolver读写联系人在实际开发中,普通App很少会开放数据接口给其他应用访问。内容组件能够派上用场的情况往往是App想要访问系统应用的通讯数据,比如查看联系人,短信,通话记录等等,以及对这些通讯数据及逆行增删改查。首先要给AndroidMaifest.xml中添加响应的权限配置 下面是往手机通讯录添加联系人信息的例子效果如下分成三个步骤先查出联系人的基本信息,然后查询联系人号码,再查询联系人邮箱代码 ContactAddActivity类packagecom.example.chapter07;importandroid

  9. Android 10.0 设置默认launcher后安装另外launcher后默认Launcher失效的功能修复 - 2

    1.前言 在10.0的系统rom定制化开发中,在系统中有多个launcher的时候,会在开机进入launcher的时候弹窗launcher列表,让用户选择进入哪个launcher,这样显得特别的不方便所以产品开发中,要求用RoleManager的相关api来设置默认Launcher,但是在设置完默认Launcher以后,在安装一款Launcher的时候,默认Launcher就会失效,在系统设置的默认应用中Launcher选项就为空,点击home键的时候会弹出默认Launcher列表,让选择进入哪个默认Launcher.所以需要从安装Launcher的流程来分析相关的设置。来解决问题设置默认La

  10. ruby - OS X 中作为守护进程运行的脚本的菜单栏图标? - 2

    我有一个ruby​​脚本(https://github.com/daemonza/MacBak)作为守护进程在我的macbook上运行并监视一堆目录的文件更改和rsync发生的任何更改。我想知道我能否让它在顶部的菜单栏中创建一个图标?只是为了让我知道它确实在运行,而不必使用ps检查它。也许以后如果需要的话,我可能希望能够从那里控制脚本,简单的带有停止和状态条目的下拉菜单等。从ObjectC看来我可以调用NSStatusItem来获取图标,但我真的只是想通过我的Ruby脚本轻松地完成它。也许我可以做一些applescript调用? 最佳答案

随机推荐