【发布时间】:2011-10-29 08:33:58
【问题描述】:
我有一个 ListView,里面有一些可聚焦的组件(主要是 EditTexts)。是的,我知道这不是完全推荐的,但总的来说,几乎所有东西都运行良好,并且焦点集中在它必须去的地方(我必须进行一些调整)。无论如何,我的问题是,当用手指滚动列表然后突然使用轨迹球在显示 IME 键盘时时会出现奇怪的竞争条件。某些东西必须越界并被回收,此时offsetRectBetweenParentAndChild() 方法必须启动并抛出IllegalArgumentException。
问题是这个异常是在我可以插入 try/catch 的任何块之外抛出的(据我所知)。所以这个问题有两种有效的解决方案:
- 有人知道为什么会抛出这个异常以及如何阻止它发生
- 有人知道如何将 try/catch 块放在至少可以让我的应用程序存活的地方。据我所知,问题在于焦点,所以它绝对不应该杀死我的应用程序(这就是它正在做的事情)。我尝试覆盖
ViewGroup的方法,但这两个offset*方法被标记为 final。
堆栈跟踪:
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)
【问题讨论】:
-
对于它的价值(或任何偶然发现的人),我已经放弃了
ListView方法来处理这个Activity。除了随机崩溃之外,如果不设置windowSoftInputMode="adjustPan",几乎不可能正确地获得焦点行为,这会打开一堆其他的蠕虫罐头。相反,我只是选择了一个“简单的”ScrollView,效果很好。 -
用砖墙做类似的事情,
ListView和EditTexts只是不值得。实际上,这个问题对我来说是个大问题。 -
我有来自生产应用程序的完全相同的崩溃堆栈,我自己无法模拟它。我有一个带有 ListView 的屏幕,其中包含动态填充的 EditViews、Chekcboxes 和 Spinners,具体取决于从服务器获取的数据。崩溃很烦人。我应该使用什么动态父视图作为动态可聚焦视图(EditViews、Check、Spinners)的容器?
-
另外,参考 OP 的报价:
Yeah, I know this isn't exactly recommended。是否有任何参考支持这一点并解释原因?非常感谢! -
ListView中EditTexts 的替代方法是将TextViews 样式设置为EditTexts,当单击时会弹出带有EditText样式的Dialog在里面。
标签: android viewgroup illegalargumentexception viewroot