回收可绘制的Imagebutton

时间:2013-09-11 10:03:14

标签: android

在我的“主屏幕”片段中,我有几个图像按钮。 Imagebutton的XML是:

                <ImageButton
                    android:id="@+id/merkzettel"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_horizontal"
                    android:background="#00000000"
                    android:scaleType="fitXY"
                    android:src="@drawable/dashboard_merkzettel_icon__selector" />

可绘制的XML选择器如下所示:

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

在旧设备(Nexus S)上,当我将设备翻转一段时间(更改屏幕方向)时,我得到例外:

java.lang.OutOfMemoryError: bitmap size exceeds VM budget
    at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
    at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:460)
    at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:336)
    at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)
    at android.content.res.Resources.loadDrawable(Resources.java:1709)
    at android.content.res.Resources.getDrawable(Resources.java:581)
etcetc

这似乎是一个常见的问题,因为Android每次重新创建Activity / Fragment时都会重新创建位图drawable,而对于Drawables,建议的解决方案是drawable.recycle() onDestroy() {}} {}}我找不到一种合适的方法来保持ImageButton的drawable。

任何人都知道这方面的解决方案吗?

1 个答案:

答案 0 :(得分:2)

在清单文件的应用程序标签中添加android:largeHeap =“true”然后运行你的项目。

喜欢下面

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@android:style/Theme.Light.NoTitleBar"
    android:largeHeap="true">
<application/>

在Destroy方法中

@Override
protected void onDestroy() {
    super.onDestroy();
    ((BitmapDrawable)imagebutton.getDrawable()).getBitmap.recycle();
}

并在onCreate方法中检查此。

if (imagebutton.getDrawable() == null){
  // set your image button image here.
} else {
  // nothing to do.
}