【关于ViewFlow】
ViewFlow是一款基于ViewGroup实现的可以水平滑动的开源UI Widget,可以从 https://code.google.com/p/andro-views/ 下载。
它使用Adapter进行条目绑定,主要用于不确定数目的视图间的切换,和ViewPager功能类似,但是可扩展性更强。
本例就是使用ViewFlow来实现页面水平切换。
【关于文章所用源码】
本文所属异常由于是从Android 4.2设备上抛出,所以文章内出现的所有源码都是Android 4.2源码,具体地址如下:http://grepcode.com/snapshot/repository.grepcode.com/java/ext/com.google.android/android/4.2.1_r1.2/
一、功能描述
采用ViewFlow+GridView的方式实现手势切屏功能,每屏以九宫格模式显示。
长按GridView里的Item切换到编辑模式,可以对Item进行删除。
二、复现场景
2.1 复现环境
本人拿了多款Android 4.2系列手机进行测试,目前只在两部手机上必现,在其他非 4.2 手机上偶尔出现。
华为Ascend P6,Android 4.2.2
联想K900,Android 4.2.1
2.2 复现步骤
进入应用后,以下三种操作都会导致所述问题:
1、Home到后台,再切换回来,Crash
2、长按Item,待切换到编辑模式后,Home到后台,再切换回来,Crash
3、左右切换几次屏幕,Home到后台,再切换回来,Crash
三、Crash Stack Info
1 java.lang.IllegalArgumentException: parameter must be a descendant of this view 2 at android.view.ViewGroup.offsetRectBetweenParentAndChild(ViewGroup.java:4295) 3 at android.view.ViewGroup.offsetDescendantRectToMyCoords(ViewGroup.java:4232) 4 at android.view.ViewRootImpl.scrollToRectOrFocus(ViewRootImpl.java:2440) 5 at android.view.ViewRootImpl.draw(ViewRootImpl.java:2096) 6 at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2045) 7 at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1854) 8 at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989) 9 at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351) 10 at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749) 11 at android.view.Choreographer.doCallbacks(Choreographer.java:562) 12 at android.view.Choreographer.doFrame(Choreographer.java:532) 13 at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735) 14 at android.os.Handler.handleCallback(Handler.java:725) 15 at android.os.Handler.dispatchMessage(Handler.java:92) 16 at android.os.Looper.loop(Looper.java:137) 17 at android.app.ActivityThread.main(ActivityThread.java:5041) 18 at java.lang.reflect.Method.invokeNative(Native Method) 19 at java.lang.reflect.Method.invoke(Method.java:511) 20 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 21 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 22 at dalvik.system.NativeStart.main(Native Method)