Android 设置活动的背景

Android 设置活动的背景,android,Android,在活动的onCreate()方法中,我获取活动布局的最外层LinearLayout。然后我检查手机的方位。如果是纵向,我将LinearLayout的背景图像设置为一个图像;如果是横向,我将线性布局的背景图像设置为另一个图像 一位用户报告说,如果他们多次打开和关闭硬件键盘,应用程序将崩溃。结果日志在从onCreate()调用的setBackgroundResource的内部深处显示OutOfMemoryError(位图大小超过VM预算)错误 我做错什么了吗?有没有一种内置的方式让Android处理

在活动的onCreate()方法中,我获取活动布局的最外层LinearLayout。然后我检查手机的方位。如果是纵向,我将LinearLayout的背景图像设置为一个图像;如果是横向,我将线性布局的背景图像设置为另一个图像

一位用户报告说,如果他们多次打开和关闭硬件键盘,应用程序将崩溃。结果日志在从onCreate()调用的setBackgroundResource的内部深处显示OutOfMemoryError(位图大小超过VM预算)错误

我做错什么了吗?有没有一种内置的方式让Android处理这个问题


如果有用的话,日志还会在崩溃上方显示大约24条“意外恢复”。这是用户打开和关闭硬件键盘。

覆盖OnConfiguration Change()方法,因为布局中的更改是用此方法处理的

  @Override
    public void onConfigurationChanged(Configuration newConfig) {
            if(newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE)
            {
                //change of background 
            }
            else if(newConfig.orientation==Configuration.ORIENTATION_PORTRAIT)
            {
                //change the background
            }
                    else
                    { //do nothing, this might apply for the keyboard }


          super.onConfigurationChanged(newConfig);


        }


    }
并将此添加到您的清单中

<activity android:name=".YourActivity"
         android:configChanges="keyboardHidden|orientation"                

                  android:label="@string/app_name">


onCreate
中加载背景图像时,保存对其的引用。我假设它是一个位图,因此在
ondestory
中调用
回收
对位图进行回收,您应该会没事。

发生这种情况是因为上一个图像会一直保留在内存中,直到垃圾收集器将其清除,并且每次用户打开或关闭键盘时,都会创建一个新的活动并完成一个图像的新实例。因此,为了防止崩溃,请清除活动中的内存。使用Femi所说的,以防是位图,或强制调用垃圾收集器

打开/关闭键盘导致方向更改事件,该事件可能会重新加载bm背景。如果你没有正确处理你的bm,那么你可能需要显示一些代码来更好地处理这个问题。我正在调用setBackgroundResource,它需要一个资源id。在我的例子中,这是R.drawable.background或R.drawable.background_scape。您可能需要在
ondestory
中执行类似
View v=getTheView()的操作;如果(v.getBackground()!=null&&BitmapDrawable.class.isInstance(v.getBackground())((BitmapDrawable)v.getBackground()).getBitBitmap().recycle()
where
getTheView
返回设置背景的原始视图实例。你还可以试试什么?尝试将配置保存在公共变量中。比如说你开始了水平方向的活动。当您的方向更改为垂直时,只需在onConfigChngd()中使用新配置进行检查。注意:试着用上面链接中的一些方法来比较。不,不。我是说你的解决方案有效。在我决定这将是我实施的解决方案之前,我仍在等待其他人的意见。我只是让你知道它起作用了。哦,太好了D我认为它不起作用:D好,好,我很高兴,我帮助了你。