【问题标题】:Setting background drawable to TextView casues java.lang.StackOverflowError将背景可绘制对象设置为 TextView 会导致 java.lang.StackOverflowError
【发布时间】:2017-07-05 05:44:17
【问题描述】:

我想在 TextView 的背景中添加一些带有 png 图像的波纹效果,发现 this Post

我有 action_darwer.xml 可绘制为

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="?attr/selectableItemBackgroundBorderless" android:state_pressed="true" /> <!-- pressed -->
    <item android:drawable="@drawable/drawer" /> <!-- default -->
</selector>

并将其设置为 TextView

<TextView android:id="@+id/action_drawer"
    android:layout_marginLeft="20dp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/action_drawer"/>

它根本不工作并给出错误

java.lang.StackOverflowError: stack size 8MB
          at android.content.res.ColorStateList.valueOf(ColorStateList.java:102)
          at android.graphics.drawable.RippleDrawable$RippleState.<init>(RippleDrawable.java:919)
          at android.graphics.drawable.RippleDrawable.createConstantState(RippleDrawable.java:914)
          at android.graphics.drawable.RippleDrawable.createConstantState(RippleDrawable.java:94)
          at android.graphics.drawable.LayerDrawable.<init>(LayerDrawable.java:126)
          at android.graphics.drawable.LayerDrawable.<init>(LayerDrawable.java:122)
          at android.graphics.drawable.RippleDrawable.<init>(RippleDrawable.java:979)
          at android.graphics.drawable.RippleDrawable.<init>(RippleDrawable.java:94)
          at android.graphics.drawable.RippleDrawable$RippleState.newDrawable(RippleDrawable.java:945)
          at android.content.res.Resources.getCachedDrawableLocked(Resources.java:2777)
          at android.content.res.Resources.getCachedDrawable(Resources.java:2745)
          at android.content.res.Resources.loadDrawable(Resources.java:2586)
          at android.content.res.TypedArray.getDrawable(TypedArray.java:749)
          at android.graphics.drawable.StateListDrawable.inflateChildElements(StateListDrawable.java:182)
          at android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:127)
          at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:1133)
          at android.graphics.drawable.Drawable.createFromXml(Drawable.java:1037)
          at android.content.res.Resources.loadDrawableForCookie(Resources.java:2718)
          at android.content.res.Resources.loadDrawable(Resources.java:2614)
          at android.content.res.TypedArray.getDrawable(TypedArray.java:749)
          at android.graphics.drawable.StateListDrawable.inflateChildElements(StateListDrawable.java:182)
          at android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:127)
          at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:1133)
          at android.graphics.drawable.Drawable.createFromXml(Drawable.java:1037)
          at android.content.res.Resources.loadDrawableForCookie(Resources.java:2718)
          at android.content.res.Resources.loadDrawable(Resources.java:2614)
          at android.content.res.TypedArray.getDrawable(TypedArray.java:749)
          at android.graphics.drawable.StateListDrawable.inflateChildElements(StateListDrawable.java:182)
          at android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:127)
          at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:1133)
          at android.graphics.drawable.Drawable.createFromXml(Drawable.java:1037)
          at android.content.res.Resources.loadDrawableForCookie(Resources.java:2718)
          at android.content.res.Resources.loadDrawable(Resources.java:2614)
          at android.content.res.TypedArray.getDrawable(TypedArray.java:749)
          at android.graphics.drawable.StateListDrawable.inflateChildElements(StateListDrawable.java:182)
          at android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:127)
          at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:1133)
          at android.graphics.drawable.Drawable.createFromXml(Drawable.java:1037)
          at android.content.res.Resources.loadDrawableForCookie(Resources.java:2718)
          at android.content.res.Resources.loadDrawable(Resources.java:2614)
          at android.content.res.TypedArray.getDrawable(TypedArray.java:749)
          at android.graphics.drawable.StateListDrawable.inflateChildElements(StateListDrawable.java:182)
          at android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:127)
          at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:1133)
          at android.graphics.drawable.Drawable.createFromXml(Drawable.java:1037)
          at android.content.res.Resources.loadDrawableForCookie(Resources.java:2718)
          at android.content.res.Resources.loadDrawable(Resources.java:2614)
          at android.content.res.TypedArray.getDrawable(TypedArray.java:749)
          at android.graphics.drawable.StateListDrawable.inflateChildElements(StateListDrawable.java:182)
          at android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:127)
        at android.graphi
02-16 13:12:53.567 22641-22641/org.team.asl.carticon E/JavaBinder: !!! FAILED BINDER TRANSACTION !!!
02-16 13:12:53.568 22641-22641/org.team.asl.carticon E/AndroidRuntime: Error reporting crash
      android.os.TransactionTooLargeException
          at android.os.BinderProxy.transactNative(Native Method)
          at android.os.BinderProxy.transact(Binder.java:504)
          at android.app.ActivityManagerProxy.handleApplicationCrash(ActivityManagerNative.java:4294)
          at com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException(RuntimeInit.java:89)
          at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693)
          at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690)

如何解决这个问题?任何建议将不胜感激。谢谢。

【问题讨论】:

  • 显示drawable/drawer代码,还是图片?
  • @VladMatvienko 是的,这正是一张图片!
  • 你确定吗?您可以发布资源文件夹结构的屏幕截图吗?

标签: android android-drawable


【解决方案1】:

StackOverflowError 发生是因为应用程序递归太深。

首先修改background

<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_pressed="true"
      android:drawable="@drawable/pressed/>  // Press State
<item android:state_focused="true"
      android:drawable="@drawable/focused"/> // Focused
<item android:drawable="@drawable/drawer"/>  // Default State

</selector>

更多详情请查看How can I modify ripple color when using ?

【讨论】:

  • 我需要在后台产生涟漪效果,因此任何 drawable.xml 文件都可以用于该状态,即按下状态
  • @ArshadAli FYI 另一个信息,drawable 不是面向大尺寸/分辨率的
【解决方案2】:

就我而言, 你不能定义 ?attr/selectableItemBackgroundBorderless 作为可绘制,这就是崩溃的地方。 将其更改为其他可绘制对象

例如:

<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/pressed" android:state_pressed="true" /> <!-- pressed -->
    <item android:drawable="@drawable/drawer" /> <!-- default -->
</selector>

【讨论】:

    猜你喜欢
    • 2016-02-21
    • 2021-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 2014-12-24
    相关资源
    最近更新 更多