ViewGroup在dispatchDraw时导致堆栈溢出

3

我有一个覆盖ViewGroup的类。下面是我的dispatchDraw实现:

@Override
protected void dispatchDraw(final Canvas canvas) {
    super.dispatchDraw(canvas);

    mViewBehind.drawShadow(mContent, canvas);
    mViewBehind.drawFade(mContent, canvas, getPercentOpen());
    mViewBehind.drawSelector(mContent, canvas, getPercentOpen());
}

然而,有时我会遇到StackOverflowError:

01-25 09:20:38.569: E/AndroidRuntime(15480): FATAL EXCEPTION: main
01-25 09:20:38.569: E/AndroidRuntime(15480): java.lang.StackOverflowError
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.text.BoringLayout.draw(BoringLayout.java:365)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.widget.TextView.onDraw(TextView.java:4225)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.View.draw(View.java:6880)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.View.draw(View.java:6883)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.widget.AbsListView.dispatchDraw(AbsListView.java:1586)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.widget.GridView.dispatchDraw(GridView.java:1948)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.View.draw(View.java:6986)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.widget.AbsListView.draw(AbsListView.java:2967)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.View.draw(View.java:6883)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.View.draw(View.java:6986)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.widget.FrameLayout.draw(FrameLayout.java:357)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.widget.ScrollView.draw(ScrollView.java:1423)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.View.draw(View.java:6883)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.View.draw(View.java:6883)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.widget.FrameLayout.draw(FrameLayout.java:357)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at com.ui.library.slidingmenu2.CustomViewAbove.dispatchDraw(CustomViewAbove.java:931)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.View.draw(View.java:6883)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.View.draw(View.java:6883)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at com.ui.library.slidingmenu2.CustomViewAbove.dispatchDraw(CustomViewAbove.java:931)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.View.draw(View.java:6883)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.View.draw(View.java:6883)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at com.ui.library.slidingmenu2.CustomViewAbove.dispatchDraw(CustomViewAbove.java:931)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.View.draw(View.java:6883)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.View.draw(View.java:6883)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.widget.FrameLayout.draw(FrameLayout.java:357)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1921)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.ViewRoot.draw(ViewRoot.java:1528)
01-25 09:20:38.569: E/AndroidRuntime(15480):    at android.view.Vie

堆栈跟踪显示 com.ui.library.slidingmenu2.CustomViewAbove.dispatchDraw(CustomViewAbove.java:931)(即super.dispatchDraw(canvas))至少被调用了4次。
当我返回到一个包含ViewPager的特定活动时,异常仅会偶尔发生,该ViewPager的第一个Fragment包含GridView。
(顺便问一下,BoringLayout是什么?)

嗨,我也遇到了同样的问题。你找到解决方案了吗? - Mehul Joisar
2个回答

0

BoringLayout是一个非常简单的布局实现,适用于单行文本且所有字符都是从左到右的。


看起来你从 https://developer.android.com/reference/android/text/BoringLayout.html 获取了这些代码行。 - Jitesh Upadhyay

0

可能有太多层了,请尝试减少布局层。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接