在安卓中,当屏幕方向改变时背景图片不会随之改变。

3

我有一个线性布局用于我的ActivityGroup,如下所定义

<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:mtx="http://schemas.android.com/apk/res/com.matriksdata"
  android:id="@+id/homeActivityGroupBG"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:orientation="vertical"
  android:background="@drawable/background">

我有2个背景图像,分别位于“ drawable”和“ drawable-land”文件夹中。当方向改变时,一切都正常,但背景不会根据方向改变。它始终保持第一个背景可用作背景。

我尝试在onConfigurationChanged方法中手动更改它,添加以下代码:

background.setBackgroundResource(R.drawable.background);

它解决了问题。但每次配置更改或通过活动时都会导致大量内存泄漏。
编辑:我创建了一个theme.xml文件来定义窗口的背景图像。XML文件包含:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Theme" parent="android:Theme">
<item name="android:windowBackground">@drawable/background</item>
</style>
</resources>

我将AndroidManifest.xml更改为:

<application android:icon="@drawable/icon" android:label="@string/app_name"
android:debuggable="true" android:name="com.matriksdata.app.DefaultApplication"
android:theme="@style/Theme">

我从布局中删除了背景元素,但是没有任何变化。当设备方向改变时,我无法获得新的可绘制对象,并且出现了内存泄漏,最终导致应用程序崩溃。
有没有其他方法可以强制更改可绘制对象的方向?或者应用程序产生内存泄漏的原因是什么?
编辑:关于内存泄漏问题,我在Android Memory Usage Problem on possibly using ActivityGroup上提出了问题。

1
我相信它会起作用。你试过把肖像背景放在drawable-port/而不是drawable/吗? - bigstones
@bigstones 我刚试了一下,不起作用。 - Alkimake
1个回答

2
与其在屏幕方向改变时切换drawable,您可以切换布局。通过将相同名称的xml文件放置在layout-land/文件夹中,当屏幕方向为横向时,操作系统将加载此备用布局。这样,您将始终使用正确的drawable(因为它们可以在两个xml文件中以不同方式指定),并且有一个额外的优势,即您可以独立地为两种方向优化布局!
Android开发者博客上的这篇文章提供了一些技巧和建议,可以帮助您在屏幕方向改变时保留对象并避免内存泄漏。

我尝试了包括你的建议在内的所有方法。当我在“layout-land”文件夹中创建一个新布局时,它可以工作。但是由于OutOfMemoryException,在3次方向更改后我的应用程序会崩溃。如果我放置这个背景,它会自动导致内存泄漏。在崩溃之前,堆大小增加了80-90%,而内存增加了50 MB,从23 MB增加到了73 MB。 - Alkimake
更改屏幕方向后,当前活动将重新启动。如果您保留对Context的任何引用,则可能会持有对已销毁的Activity或后台Drawable的引用。相反,Context引用应绑定到活动的生命周期。在没有看到您的实际代码的情况下,这是我对为什么会出现泄漏的合理猜测。Android文档提供了一些避免内存泄漏的建议-我建议确保您的应用程序遵循这些建议(http://developer.android.com/resources/articles/avoiding-memory-leaks.html)。 - Sam Hogarth
我保证我的应用程序遵循了这些建议。我还在SO上询问了关于内存泄漏的问题。http://stackoverflow.com/questions/5116728/android-memory-usage-problem-on-possibly-using-activitygroup。正如您所看到的,只有当我添加了这个背景时才会出现内存泄漏问题。没有背景就没有OOM问题,内存分析器显示应用程序非常稳定。似乎内存问题的主要原因是这个drawable。这就是为什么我最终得出了这个结果,因为我消除了所有内存问题并避免了它们。 - Alkimake
你试过直接将背景放在linerlayout标签中吗?我也遇到了这个问题,似乎与将背景引用放在主题xml文件中直接相关。如果我直接将其放在布局文件中,它就会起作用。当然,这并不理想,因为我需要搜索每个布局屏幕文件并在其中放置背景引用。 - Maxrunner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接