4

为了避免在屏幕方向改变时再次运行 onCreate(),我将以下内容放入我的 Android 清单中:

android:configChanges="orientation|keyboardHidden|screenSize"

没关系。但是我仍然希望能够旋转屏幕,只是改变方向但不再经历 onCreate->onStart->etc 生命周期。

我像这样覆盖了 onConfigurationChanged 方法:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
}

这很好用。但是,我有一个背景图像,需要根据设备是处于纵向模式还是横向模式来更改。我尝试将以下行添加到我的代码中:

mBackground.setBackgroundResource(R.drawable.splash_bg);

这样做的目的是重新加载 splash_bg 资源,因为方向已经改变,所以它会在 drawable-land 文件夹中查找图像。

所以方法现在看起来像这样:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    mBackground.setBackgroundResource(R.drawable.splash_bg);
}

但它并不完全正确。在最初以纵向模式启动设备后,纵向背景图像会显示。旋转它(进入横向模式)将成功地将背景图像从纵向背景更改为横向背景(在可绘制区域中找到的那个)。反过来也是如此(如果您从横向开始并切换到纵向),因为我还在 drawable-port 文件夹中包含了背景图像的纵向模式版本(在普通 ol'drawable 文件夹的顶部)。

所以在初始旋转时它工作正常。但是,如果您将方向切换回您开始的位置,它不会将图像刷新到正确的方向类型。基本上它只工作一次。

有人对此有想法吗?如有必要,我会提供更多代码,但我认为我包含了所有需要的代码。谢谢!

4

2 回答 2

3

首先,不要使用configChanges. 那是懒惰的出路,将来会咬你。可绘制对象被缓存,因此这很可能会导致获取正确图像的问题(这可以解释为什么它只工作一次但不能工作)。你可以通过两个drawables来解决这个问题——一个名为splash_bg_port,一个名为splash_bg_land,并使用它们,打开你接收的方向newConfig

此外,如果您的 splash_bg 是一个包含位图项目的图层列表,我注意到在您第一次访问可绘制对象后,有时它不会从正确的资源文件夹中提取(由于缓存)。

于 2013-09-11T23:15:30.440 回答
1

这是否有效检查它

@Override
public void onConfigurationChanged(Configuration newConfig) {
 mBackground.setBackgroundResource(R.drawable.splash_bg);
    super.onConfigurationChanged(newConfig);

}
于 2013-09-11T23:36:35.667 回答