android - 屏幕方向改变后刷新资源

标签 android

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

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-land 中找到的那个)。反之亦然(如果你从横向开始然后切换到纵向),因为我还在 drawable-port 文件夹中包含了背景图像的纵向模式版本(在普通的 ol'drawable 文件夹之上)。

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

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

最佳答案

首先,不要使用configChanges。那是懒惰的出路,将来会害了你。 Drawables 被缓存,所以这很可能导致获取正确的方向图像的问题(这可以解释为什么它只工作一次而不是之后)。您可以通过使用两个可绘制对象来解决这个问题——一个名为 splash_bg_port,一个名为 splash_bg_land,然后使用它们,切换您从 newConfig 接收到的方向。

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

关于android - 屏幕方向改变后刷新资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18752810/

相关文章:

android - angular 在 href 中的 url 之前添加不安全 - 清理不安全的 URL

android - 带有 CoordinatorLayout 和 AppBarLayout 的 Recyclerview

java - 使用 SparseIntArray 和其他来自 android.util.* 的本地单元测试

android - WebView 在另一个类的 fragment 中加载 url

java - Android数据存储用于绘制图表

android - android登录后访问https内容

java - YouTubePlayer.Provider 初始化方法引起的内存泄漏

android - 针对 Android 中的特定运营商

android - 按钮不显示, Material 主题不工作

android-layout - 如何获取android中布局的底部?