ImageViews
アクティビティに4 を表示するアプリがあります。可能なすべての画像を res/drawable フォルダーに保存します。画像はすべて .png で、サイズは 5KB ~ 22KB で、すべて 300x300 ピクセルです。画像は次のようなメソッドで設定されます:
private void displayChoices() {
iv1.setImageResource(mArrayList.get(0)
.getResourceId(this));
iv2.setImageResource(mArrayList.get(1)
.getResourceId(this)); // <--Usually fails on second image.
iv3.setImageResource(mArrayList.get(2)
.getResourceId(this));
iv4.setImageResource(mArrayList.get(3)
.getResourceId(this));
}
このdisplayChoices()
メソッドは、セッション全体で複数回呼び出されます。これまでのところ、 Displaying Bitmaps Efficientlyを読んできましたが、画像の解像度を縮小しようとすると画像が粗くなります。
mArrayList は、オブジェクトの ArrayList です。オブジェクト クラス内には、getResourceId というメソッドがあります。
public int getResourceId(Context ctx) {
int mResId;
String packageName = ctx.getPackageName();
String mDrawableName = filename.substring(0, filename.lastIndexOf('.')); //filename is stored in the database and is set when I create the object. it is just a reference to the an .png file in the resource folder.
mResId = ctx.getResources().getIdentifier(mDrawableName , "drawable", packageName);
return mResId;
}
画像は、画面上に均等に配置された 2x2 グリッドで表示されます。
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:baselineAligned="false"
android:orientation="horizontal" >
<FrameLayout
android:id="@+id/choice_1_frame"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:padding="5dip" >
<ImageView
android:id="@+id/choice_1_image"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="center"
android:adjustViewBounds="true"
android:src="@drawable/test_image300x300" />
</FrameLayout>
//repeat frame layout
</LinearLayout>
//Repeat LinearLayout
メソッドが呼び出されるたびに古い画像への参照をクリアしようとしましたが、最初の呼び出しで失敗したため、今は迷っています。OutOfMemory 例外の発生を停止する方法に関するアイデア。