防止/捕获“IllegalArgumentException:参数必须是此视图的后代”错误

2023-11-29

我有一个 ListView,里面有一些可聚焦的组件(主要是EditTexts)。是的,我知道这并不完全推荐,但总的来说,几乎一切都工作正常,并且焦点集中在它必须去的地方(我必须编码一些调整)。不管怎样,我的问题是,当用手指滚动列表然后突然使用轨迹球时,会出现奇怪的竞争条件当显示 IME 键盘时。某些东西必须越界并被回收,此时offsetRectBetweenParentAndChild()方法必须启动并抛出IllegalArgumentException.

问题是这个异常被抛出到任何我可以插入 try/catch 的块之外(据我所知)。因此,这个问题有两个有效的解决方案:

  1. 有人知道why抛出这个异常以及如何阻止它发生
  2. 有人知道如何在某个地方放置一个 try/catch 块,至少可以让我的应用程序生存。据我所知,问题在于焦点,所以它绝对不应该杀死我的应用程序(这就是它正在做的事情)。我尝试覆盖ViewGroup的方法,但是那两个offset*方法被标记为最终的。

堆栈跟踪:

08-17 18:23:09.825: ERROR/AndroidRuntime(1608): FATAL EXCEPTION: main
08-17 18:23:09.825: ERROR/AndroidRuntime(1608): java.lang.IllegalArgumentException: parameter must be a descendant of this view
08-17 18:23:09.825: ERROR/AndroidRuntime(1608):     at android.view.ViewGroup.offsetRectBetweenParentAndChild(ViewGroup.java:2633)
08-17 18:23:09.825: ERROR/AndroidRuntime(1608):     at android.view.ViewGroup.offsetDescendantRectToMyCoords(ViewGroup.java:2570)
08-17 18:23:09.825: ERROR/AndroidRuntime(1608):     at android.view.ViewRoot.scrollToRectOrFocus(ViewRoot.java:1624)
08-17 18:23:09.825: ERROR/AndroidRuntime(1608):     at android.view.ViewRoot.draw(ViewRoot.java:1357)
08-17 18:23:09.825: ERROR/AndroidRuntime(1608):     at android.view.ViewRoot.performTraversals(ViewRoot.java:1258)
08-17 18:23:09.825: ERROR/AndroidRuntime(1608):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1859)
08-17 18:23:09.825: ERROR/AndroidRuntime(1608):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-17 18:23:09.825: ERROR/AndroidRuntime(1608):     at android.os.Looper.loop(Looper.java:130)
08-17 18:23:09.825: ERROR/AndroidRuntime(1608):     at android.app.ActivityThread.main(ActivityThread.java:3683)
08-17 18:23:09.825: ERROR/AndroidRuntime(1608):     at java.lang.reflect.Method.invokeNative(Native Method)
08-17 18:23:09.825: ERROR/AndroidRuntime(1608):     at java.lang.reflect.Method.invoke(Method.java:507)
08-17 18:23:09.825: ERROR/AndroidRuntime(1608):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
08-17 18:23:09.825: ERROR/AndroidRuntime(1608):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
08-17 18:23:09.825: ERROR/AndroidRuntime(1608):     at dalvik.system.NativeStart.main(Native Method)

While 布鲁斯的回答确实解决了问题,但它以一种非常残酷的方式做到了这一点,这损害了用户体验,因为一旦我们进行滚动,它就会清除每个视图的焦点。

它解决了问题的表象,但没有解决实际原因。

如何重现问题:

您的 EditText 具有焦点并且键盘已打开,然后您滚动直到 EditText 离开屏幕,并且它没有回收到现在显示的新 EditText。

我们先来了解一下为什么会出现这个问题:

众所周知,ListView 回收其视图并再次使用它们,但有时它不需要立即使用已离开屏幕的视图,因此它会保留它以供将来使用,并且因为它不需要再显示,所以它会保留它以供将来使用。将分离它,导致 view.mParent 为空。 然而键盘需要知道如何将输入传递给它,它通过选择聚焦视图(准确地说是 EditText)来实现。

所以问题是我们有一个具有焦点的 EditText,但突然没有父级,因此我们得到一个“参数必须是此视图的后代”错误。这是有道理的。

通过使用滚动侦听器,我们会造成更多问题。

解决方案:

我们需要监听一个事件,该事件会告诉我们视图何时进入侧堆并且不再附加,幸运的是 ListView 公开了此事件。

listView.setRecyclerListener(new AbsListView.RecyclerListener() {
        @Override
        public void onMovedToScrapHeap(View view) {
            if ( view.hasFocus()){
                view.clearFocus(); //we can put it inside the second if as well, but it makes sense to do it to all scraped views
                //Optional: also hide keyboard in that case
                if ( view instanceof EditText) {
                    InputMethodManager imm = (InputMethodManager) view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
                }
            }
        }
    });
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

防止/捕获“IllegalArgumentException:参数必须是此视图的后代”错误 的相关文章

  • 如何设置日期选择器的日期?

    I use DatePickerDialog OnDateSetListener效果很好 我想在日期选择器中添加 120 天的日期 我的意思是 如果我添加 120 天 日期和月份将自动更改 怎么做 像这样的事情应该可以解决问题 Calend
  • 即使成功固定后,ParseQuery 在从本地数据存储查询时也给出 0 个对象

    我正在使用 parse com 的 Android SDK 并且遇到了一个特殊的问题 从片段的 onCreate 中 从服务器获取一个对象 Pin it 从本地数据存储中获取对象 以下是 onCreate 中的代码片段 ParseObjec
  • 更新房间迁移的行

    是否可以编写迁移来更新某个表的所有先前数据 我正在为我的房间数据开发加密 如果我可以在迁移后加密所有行 那就太好了 那么 在定义迁移时 您可以访问支持SQLite数据库 https developer android com referen
  • 文件 API - Phonegap?

    谁能解释如何使用适用于 Android 的 Phonegap 文件 API 在页面上列出文件文件夹 我想列出所有 mp3如果可能的话 请阅读文件 但已阅读所有phonegap文档 http docs phonegap com en 1 0
  • 清除未接来电并清除 Android 栏中的通知

    使用此代码 我设法将所有未接来电标记为已读 ContentValues values new ContentValues values put Calls NEW 0 if android os Build VERSION SDK INT
  • 使用书法库的某些活动使用不同的字体

    我在用书法 https github com chrisjenx Calligraphy在我的应用程序中使用自定义字体的库 我使用默认字体为整个应用程序设置了自定义字体CalligraphyConfig in my Application类
  • Android 设备与本地 API 服务器通信

    我想知道如何在外部设备上模拟我的 Android 应用程序 以便与我的计算机上运行的本地 API 服务器进行通信 该应用程序使用 cordova 并使用 USB 连接在 Android 设备上运行 我正在本地运行 API 服务器 使用我的机
  • LibGDX 闪烁

    我已经使用 LibGDX UI 设置来启动一个项目 我在实现 ApplicationListener 中唯一拥有的是 public void create setScreen new LoadingScreen this 这应该会触发 Lo
  • 当我滚动 gridview 时图像发生变化

    GridView 从 URL 加载图像 当我滚动 gridview 时 更多图像机会 如何修复它 我尝试过 imageAdapter notifyDataSetChanged gridView invalidateViews 我还没有找到这
  • 具有线程安全性的 eventbus 最佳实践

    我的应用程序具有用户交互活动和后台服务 这是修改数据模型的唯一地方 后台服务监听用户所做的操作以及来自网络的传入消息 因此 可能会出现并发问题 我尝试使用处理程序来防止这些问题 对于事件层 我使用 greenrobots Eventbus
  • 如何在phonegap中同时使用相机API选择多个图像?

    如何同时选择或拾取多个图像phonegap camera API使用时Camera DestinationType FILE URI 我一次只能选择一张图像 我可以使用以下命令在 SD 卡中选择多个文件 包括 txt pdf this ht
  • 跨平台 IAP

    我已在 iOS 和 Android 中集成了应用内购买 自动续订订阅 两者都工作正常 我对使用跨平台验证 IAP 有一定的疑问 例如 当多个用户登录一个应用程序时 某一特定应用程序的订阅如何运作 例如 如果用户 A 有标准套餐并且从应用程序
  • SQLiteAssetHelper 甚至在从资产文件夹复制数据库之前就导致立即崩溃

    https github com jgilfelt android sqlite asset helper https github com jgilfelt android sqlite asset helper 我要从SQLiteOpe
  • 使用 Espresso + MockK 进行 Android UI 测试时,在模拟器上使用 SIGSEGV 会崩溃,在物理设备上则正常

    我刚刚开始使用MockK模拟基于 MVP 的应用程序中的所有存储库 服务逻辑以进行 UI 测试 我有一些运行登录活动的 UI 测试 其中 Espresso 输入登录名和密码 并使用 MockK 我可以fake登录失败或无法登录的各种情况 所
  • Android 位图到 WebRtc I420 帧损坏

    尝试通过 WebRtc 流式传输位图 我的 Capturer 类大约如下所示 public class BitmapCapturer implements VideoCapturer VideoSink private Capturer c
  • MediaPlayer() 音频口吃(android)

    我正在我的 Android 应用程序中使用 MediaPlayer 函数从远程服务器传输实时音频流 但音频断断续续且断断续续 问题不在于我的互联网 因为当我在计算机上播放时 提要播放得很好 可能是什么问题 注意 直播正在进行中 这是我正在使
  • 当 SystemUI 在 Android Boot 中加载时

    如何知道系统 UI 何时加载Android启动过程 状态栏和导航栏视图到底绘制在哪里 作为SystemUI是一个特权应用程序 那么它是否在启动器应用程序 主屏幕 启动之前加载 我不知道 欢迎任何建议 下面是一系列简要解释的步骤 希望能够阐明
  • Android 开发:seekbar 倒计时!

    是否有可能 如果是 如何 如何在用户不执行任何操作的情况下从进度 100 变为 1 就像每0 05秒seekbar setProgress 1 因此 如果用户不执行任何操作 搜索栏就会下降 直到达到 1 请回答如何做到这一点 谢谢 clas
  • Android 依赖项 com.google.firebase:firebase-core 编译 (12.0.1) 和运行时 (11.4.2) 的版本不同

    这是我的项目 Gradle 依赖项 classpath com android tools build gradle 3 1 0 classpath com google gms google services 3 0 0 classpat
  • Android 中的自定义相机应用程序问题 - 旋转 270、拉伸捕获视图且未获取所有功能

    我从代码中得到了帮助https github com josnidhin Android Camera Example https github com josnidhin Android Camera Example 但面临一些问题 例如

随机推荐

  • Spring 4.2.3和fasterxml Jackson 2.7.0不兼容

    从 fastxml jackson 2 6 3 迁移到 2 7 0 后 这是因为public JavaType constructType Type type Class
  • 如何在没有终端窗口的情况下运行PowerShell脚本?

    下面的快捷方式执行 powershell exe 并向其传递脚本 vscode ps1 它的工作原理是 对于我的所有尝试 它在运行时仍然会短暂显示一个终端窗口 您可以看到我已经传递了应该防止这种情况发生的参数 但我仍然看到该窗口 我需要做什
  • 如何在谷歌应用程序脚本中模拟搜索和替换范围

    我想自动替换 Google 表格中的一些文本 我在执行 CTRL H 搜索和替换时使用了记录宏功能 但没有记录任何内容 然后我尝试了这段代码 spreadsheet getRange B B replace oldText newText
  • 查找联系人组的帐户性质?

    我正在开发一个应用程序 其中需要找到联系人组的性质 即是谷歌组 电话组还是SIM组 如何找到它 请建议我该怎么做 提前致谢 下面的代码打印联系人姓名和类型 我还没有优化它 它会打印多条记录 但我想你会知道该怎么做 package com e
  • 在表结构上添加一个where-对象?

    用 label 重命名标题 我想过滤最后一个 SpaceLeft 但它不能正常工作 例如 Get WmiObject win32 logicaldisk ComputerName sfuslt167 Filter drivetype 3 F
  • 如何使用 CSS 使绝对 div 水平居中?

    我有一个 div 并希望它水平居中 尽管我给了它margin 0 auto 它不是居中的 container position absolute top 15px z index 2 width 40 max width 960px min
  • 如何使用 GameKit 在 iPhone 蓝牙中区分主机和客户端

    我使用 GameKit 框架制作了一款多人游戏 其中 2 个 iPhone iPod 可以通过蓝牙相互连接并玩 我正在考虑一种方法来选择哪个设备可以先播放 因此 合理的解决方案是选择连接的主机 GKSession 中是否有服务器和客户端 他
  • 在 Create React App 实用程序中启用 CORS

    我需要使用CORSReact 中的节点模块使用以下命令创建create react app公用事业 由于它是一个实用程序 我无法在内部进行调整和注入CORS进入预配置的EXPRESS module 我们怎样才能做到这一点 如果你需要这个来进
  • Nil 不能赋值给 ()->() 类型?

    这是一个类中的函数 可让您进行双击和单击手势 它在 Swift 2 3 中工作正常 但转换到 Swift 3 后会抛出一些错误 我一生都无法理解 弄清楚 我评论了它们发生的地方 UIShortTapGestureRecognizer swi
  • public_html上面存储和读取图片

    我正在尝试保护我的 PHP 图像上传脚本 我必须跨越的最后一个障碍是使用户无法直接执行图像 但服务器仍然可以在网页中提供它们 我尝试更改文件夹的所有权和权限但无济于事 因此我尝试存储 public html 上面的图像并将它们显示在存储在
  • Phonegap HTML5 / Android 应用程序 - Iframe 高度问题

    我们构建了一个 HTML5 应用程序 可以动态加载 iFrame 来显示外部内容 这个解决方案一直运行良好 直到 android 4 0 发布 这似乎改变了 iframe 渲染的工作方式 它似乎无法再检测高度 它显示一个小的可滚动框 其中包
  • 多个 CMake 目标的 target_compile_definitions?

    I ve been told做诸如设置之类的事情是不好的做法CFLAGS直接在 CMake 中 相反 我应该使用target compile definitions 命令 好的 但是 如果我想对多个 独立 目标使用相似 相同的定义怎么办 我
  • 在 C# 中格式化 Excel 中多行的最快方法

    我有一个巨大的数据集 我想将其写入 Excel 并且需要根据业务逻辑对行执行条件格式设置 因此 对于数据插入部分 我使用数据数组来填充 Excel 并且工作速度非常快 但是 在格式化行时 我发现性能严重下降 仅进行格式化就几乎花费了一倍以上
  • 我是否需要最新版本的 Xcode 才能将应用程序提交到应用程序商店? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我目前在 Snow Leopard 10 6 6 上运行 Xcode 版本 3 2 5 这意味着我可以在模拟器上运行 iOS 4 2 及以上版本的应用程序 如果我使用过时版本的 Xc
  • 使用 IRdisplayl::display_html 在 Jupyter 笔记本中显示观星仪输出时出错

    m lt capture output stargazer lm enroll lm grades lm score digits 3 header FALSE type html se rob se title Linear Panel
  • 如何为网络应用程序创建 exe?

    我使用 Visual studio 2012 ASP Net 4 5 C 和 Web 服务开发了一个 Web 应用程序 两者都放在一个解决方案中 我需要将我的解决方案转换为 EXE 文件 为我的 Web 应用程序创建 EXE 我真正需要的是
  • 如何显式地从某些特征调用函数?

    我想知道如何从特征调用函数 前提是有多个特征具有相同的函数名称 问题出在33行或者tr1 tr v 我该如何表达我想要调用的特质 struct V2D x i32 y i32 impl V2D fn new x i32 y i32 gt V
  • 如何在Python中让用户输入真/假?

    我是蟒蛇新手 我想让程序询问 is Johnny hungry True or false 用户输入 True然后打印是 Johnny needs to eat 用户输入错误然后打印 Johnny is full 我知道添加一个我输入的 i
  • 合并哈希数组中的重复项

    我有一个 ruby 中的哈希数组 name one tags xxx name two tags yyy name one tags zzz 我正在寻找任何干净的红宝石解决方案 这将使它能够简单地合并该数组中的所有重复项 通过合并我的意思是
  • 防止/捕获“IllegalArgumentException:参数必须是此视图的后代”错误

    我有一个 ListView 里面有一些可聚焦的组件 主要是EditTexts 是的 我知道这并不完全推荐 但总的来说 几乎一切都工作正常 并且焦点集中在它必须去的地方 我必须编码一些调整 不管怎样 我的问题是 当用手指滚动列表然后突然使用轨