0

私の ImageView は Activity レイアウトで定義されており、ListView または GridView がないため、ここでは自動ビュー リサイクルはありません。アクティビティが読み込まれるたびに、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>
4

2 に答える 2

1

(編集済み。エイリアスが原因であるという私の最初の推測は、これを読んでいる人にとって誤解を招き、混乱を招くでしょう。)

さて、私は解決策に出くわしたようです。

以前に表示されたアクティビティで同じドローアブルを参照し、そこでリサイクルしました。これはエラーの原因ではありませんよね?そうですね。

そのため、レイアウト インフレータが新しいドローアブルを提供することを期待しないでください。利用可能な場合は、以前に膨らませたものを提供する場合があります。

于 2013-05-18T12:49:27.027 に答える
0

問題はスケーリングだと思います!スケーリング部分は、新しい画像を返します。ただし、スケーリングが不要な場合は、古いインスタンスが再び返されます。システムは古いイメージをリサイクルするので、新しいイメージもリサイクルされます! 「リサイクルされたビットマップを描画できません」というメッセージが表示されます。「scaleType」属性を削除して、もう一度テストしてください。

于 2013-05-18T12:53:00.770 に答える