为了避免在屏幕方向改变时再次运行onCreate(),我已将以下内容放入我的Android清单中:
android:configChanges="orientation|keyboardHidden|screenSize"
没关系。但是我仍然希望能够旋转屏幕,只需更改方向,但不要再次通过onCreate-> onStart->等生命周期。
我像这样覆盖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-land中找到的背景图像)。反之亦然(如果你从横向开始并切换到肖像),因为我还在drawable-port文件夹中包含了背景图像的肖像模式版本(在普通ol'drawable文件夹的顶部)。
所以在初始旋转时它工作正常。但是,如果将方向BACK切换到开始位置,则不会将图像刷新为正确的方向类型。基本上它只能工作一次。
有人对此有所了解吗?如有必要,我会提供更多代码,但我认为我已经包含了所有需要的代码。谢谢!
答案 0 :(得分:3)
首先,请勿使用configChanges
。这是懒惰的出路,将来最终会咬你。 Drawables被缓存,因此很可能会导致获取方向的正确图像(这可以解释为什么它可以工作一次但不能解决)。您可以通过使用两个drawable来解决这个问题 - 一个名为splash_bg_port,一个名为splash_bg_land,并使用这些,从而切换从newConfig
收到的方向。
另外,如果您的splash_bg是一个带有位图项的图层列表,我注意到有时它在第一次访问drawable后没有从正确的资源文件夹(由于缓存)中拉出来。
答案 1 :(得分:1)
这是否有效检查
@Override
public void onConfigurationChanged(Configuration newConfig) {
mBackground.setBackgroundResource(R.drawable.splash_bg);
super.onConfigurationChanged(newConfig);
}