屏幕方向变化后刷新资源

4
为避免屏幕方向改变时重新运行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);

这个目的是为了重新加载闪屏背景资源,以便它能够在方向改变后查找drawable-land文件夹中的图像。

现在方法看起来像这样:

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

但它并不能完全正常工作。例如,初始启动设备时,以纵向模式为例,将显示纵向背景图像。将其旋转(进入横向模式)将成功地将背景图像从纵向背景更改为横向背景(在drawable-land中找到的一个)。反之亦然(如果您从横向开始并切换到纵向),因为我还在drawable-port文件夹中包含了背景图像的纵向模式版本(在普通的drawable文件夹之上)。
因此,在初始旋转时,它可以正常工作。但是,如果您将方向切换回到起始位置,则不会将图像刷新为其正确的方向类型。基本上,它只能工作一次。
有人对此有想法吗?如果需要,我可以提供更多代码,但我认为我已经包含了所有必要的内容。谢谢!

1
android:configChanges="orientation|keyboardHidden|screenSize" “这没问题。” 不,不是的。即使谷歌也说不应该使用它,这是一种hack。如果您没有正确编写Activity生命周期,它会掩盖许多问题。例如,除了您解决的3个原因之外,还有半打其他原因会导致您的活动被销毁和重新创建,除非您很幸运,否则您的应用程序将崩溃。请谷歌一下,了解原因。 - Simon
2个回答

3
首先,不要使用configChanges。这是懒惰的方式,将来可能会给你带来麻烦。可绘制对象被缓存,因此这可能会导致在获取正确的方向图像时出现问题(这解释了为什么它仅在第一次工作后就无法正常工作)。您可以通过拥有两个可绘制对象--一个名为splash_bg_port,另一个命名为splash_bg_land,并根据从newConfig接收到的方向进行切换来解决这个问题。
此外,如果您的splash_bg是一个具有位图项的层列表,我注意到有时在第一次访问可绘制对象后,它不会从正确的资源文件夹中提取(由于缓存)。

当您改变方向时,您还有什么其他方式可以阻止生命周期重新启动呢? - JMRboosties
1
你不需要处理它。你要为它做好准备并处理它。onSaveInstanceState() 是你的好朋友。 - Kevin Coppock

1

这个是否有效,请检查一下。

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

}

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