我的ImageView在Activity布局中定义,并且没有ListView或GridView,因此这里没有自动视图回收。每当Activity加载时,我在logcat中遇到“java.lang.IllegalArgumentException:无法绘制回收的位图”的崩溃。 这是我的ImageView的风格。正如你所看到的,这里没什么特别的。关于图像唯一值得注意的是它非常大(Nexus 10的全屏尺寸)。我知道这个观点是罪魁祸首,因为评论它可以解决错误。
<style name="tabletbackground">
<item name="android:scaleType">centerCrop</item>
<item name="android:src">@drawable/loading_background</item>
<item name="android:contentDescription">background image</item>
<item name="android:layout_width">fill_parent</item>
<item name="android:layout_height">fill_parent</item>
</style>
此活动的代码中没有任何地方调用回收位图。知道这里发生了什么吗?
这是好奇的一些布局。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
style="@style/news_act_root" >
<ImageView
style="@style/tabletbackground"
android:id="@+id/tabletbackground" />
<!-- redacted -->
</RelativeLayout>
答案 0 :(得分:1)
(已编辑。我原先猜测它是由别名引起的,会误导和混淆任何阅读此内容的人。)
看起来我偶然发现了一个解决方案。
我在之前显示的Activity中引用了相同的drawable,我确实在那里回收了它。这不应该导致错误,对吗?它确实如此。
所以不要指望布局inflater给你一个新的drawable。如果一个可用,它可能会给你一个先前膨胀的。
答案 1 :(得分:0)
我认为问题是缩放!缩放部分,返回一个新图像。 但是当不需要缩放时,它会再次返回旧实例。 系统会回收旧图像,因此新图像也会回收!并且你得到“无法绘制回收的位图” 删除“scaleType”属性并再次测试。