当您收到类似下面的错误(Android 1.5)时,是因为嵌套的ViewGroup太多,还是因为View的总数太大了?是否有任何技巧可以解决它,同时仍然保持您的应用程序相同的外观?
java.lang.StackOverflowError
at android.text.Styled.measureText(Styled.java:371)
at android.text.Layout.measureText(Layout.java:1600)
at android.text.Layout.getLineMax(Layout.java:654)
at android.text.Layout.draw(Layout.java:310)
at android.text.BoringLayout.draw(BoringLayout.java:356)
at android.widget.TextView.onDraw(TextView.java:3921)
at android.view.View.draw(View.java:5838)
at android.view.ViewGroup.drawChild(ViewGroup.java:1486)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1228)
at android.view.ViewGroup.drawChild(ViewGroup.java:1484)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1228)
at android.widget.AbsListView.dispatchDraw(AbsListView.java:1319)
at android.widget.ListView.dispatchDraw(ListView.java:2820)
at android.view.View.draw(View.java:5944)
at android.widget.AbsListView.draw(AbsListView.java:2121)
at android.view.ViewGroup.drawChild(ViewGroup.java:1486)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1228)
at android.view.ViewGroup.drawChild(ViewGroup.java:1484)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1228)
at android.view.View.draw(View.java:5841)
at android.widget.FrameLayout.draw(FrameLayout.java:352)
at android.view.ViewGroup.drawChild(ViewGroup.java:1486)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1228)
at android.view.ViewGroup.drawChild(ViewGroup.java:1484)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1228)
at android.view.View.draw(View.java:5841)
at android.widget.FrameLayout.draw(FrameLayout.java:352)
at android.view.ViewGroup.drawChild(ViewGroup.java:1486)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1228)
at android.view.View.draw(View.java:5841)
at android.view.ViewGroup.drawChild(ViewGroup.java:1486)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1228)
at android.view.View.draw(View.java:5841)
at android.view.ViewGroup.drawChild(ViewGroup.java:1486)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1228)
at android.view.View.draw(View.java:5841)
at android.widget.FrameLayout.draw(FrameLayout.java:352)
at android.view.ViewGroup.drawChild(ViewGroup.java:1486)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1228)
at android.view.ViewGroup.drawChild(ViewGroup.java:1484)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1228)
at android.view.ViewGroup.drawChild(ViewGroup.java:1484)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1228)
at android.view.View.draw(View.java:5841)
at android.widget.FrameLayout.draw(FrameLayout.java:352)
at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1847)
at android.view.ViewRoot.draw(ViewRoot.java:1217)
at android.view.ViewRoot.performTraversals(ViewRoot.java:1030)
at android.view.ViewRoot.handleMessage(ViewRoot.java:1482)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:3948)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540)
at dalvik.system.NativeStart.main(Native Method)
答案 0 :(得分:32)
你有(太多)嵌套布局。您可以访问d.android.com上的官方Android博客,获取有关如何优化布局的提示和技巧。
答案 1 :(得分:6)
就我而言,我在
中解决了onCreateView
rootView = inflater.inflate(R.layout.fragment_interest_list, container); return rootView;
添加 attachToRoot 参数
rootView = inflater.inflate(R.layout.fragment_interest_list,container,false); return rootView;
答案 2 :(得分:5)
在我的情况下,它是由嵌套布局(复杂列表itens)引起的,位于另一个片段内的片段视图分页器中的列表中,使用v4支持和HoloEverywhere v1.4库。
我必须删除嵌套的片段并以不同的方式构建它。
答案 3 :(得分:2)
就我而言,
自定义列表视图具有相对布局,然后发布Stackoverflowerror
。
如果您的listview
具有相对布局,请将其删除:D
答案 4 :(得分:0)
我的情况是ListView
内ScrollView
,当我尝试将其滚动到底部时。它会产生堆栈溢出错误。
因此,请避免ListView
内有ScrollView
。
或者我们可以使用不同的方法来实现ListView。
答案 5 :(得分:0)
在我的案例和XamarinForms中,我通过向CachingStrategy="RecycleElement"
添加ListView
并删除了额外的布局来解决了这个错误。
Android用户应使用RecyclerView
或其他视图回收方法。
答案 6 :(得分:0)
对于Xamarin Forms,在我们的情况下,使用ListViews没有解决问题,异常一直在我们有旋转木马上升,我们无法从另一个线程调用draw方法,因为一些图形涂有NControl我们需要不允许我们这样做(我猜是OpenGL相关)。所以最后只是在我们的轮播自定义渲染器中捕获异常并在其上调用Invalidate()解决了问题。
答案 7 :(得分:-2)
使用约束布局的日子已经改变,单个约束布局可以使您的视图层次扁平化