この例は、setImageResourceとsetImageDrawableの場合で、同じことが背景にも当てはまりますか?
それでは、好ましい選択は何ですか?
ドキュメント によるとsetImageResource、UIスレッドでビットマップの読み取りとデコードが行われるため、遅延が発生する可能性があります。setImageResourceしたがって、上記のどの場合がより良い選択であるかを尋ねるなら、あなたの質問はより良いでしょうsetImageDrawable。
私の推測では、setImageResourceは画像の遅延読み込みに使用さsetImageDrawableれ、ビューの開始時にDrawableを介して画像を既に読み込みている場合に使用されます。どちらがあなたに最も適しているかは、おそらくあなたがより深刻なメモリの制約があるかどうかに依存します。私の経験でsetImageResourceは、ほとんど必要ありません。
そして、あなたのコードが機能しない理由に答えるために; getDrawable()これは、resourceId 0から実行できないためです。これは、リソースが見つからないため、例外をスローします。setImageResourceは遅延読み込みであるため、Drawableを作成する前にリソースが0であるかどうかを確認し、例外をスローしません。あなたはおそらくそれをリファクタリングすることができますif(checked) setImageDrawable(..) else setImageDrawable(null);
実際には、両方の方法に少し違いがあります。
最初のものは、 resフォルダーsetImageResourceに必要な画像がある場合に使用されます。ただし、Drawableタイプのオブジェクトを作成する場合は、2番目の方法が使用される可能性があります。setImageDrawable
また、リソースファイルはDrawableタイプに変換できますが、DrawableをResourceに変換することはできないことに注意してください。
resフォルダーに画像がある場合は、画像をDrawableに変換してから、2番目の方法を使用するのではなく、最初の方法を使用するとよいでしょう。
ドローアブルはメモリ内にありますsetImageResourceは、genファイルに保存されているIDへのポイントです