如何检测设备从竖屏模式切换到横屏模式?

6

我有一个应用程序,在一个活动中显示全屏位图。为了提供快速加载时间,我在内存中加载它们。但是当屏幕方向改变时,我想清除缓存,以便再次填充适合新尺寸的位图。唯一的问题是,为了做到这一点,我需要检测何时发生方向改变。有人知道如何检测吗?

4个回答

23

请查看官方文档http://developer.android.com/guide/topics/resources/runtime-changes.html

更改它将实际创建一个新视图,并再次调用onCreate。

此外,您可以通过

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

    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
    }
}

6
请注意,只有当您在清单文件中选择了要使用android.R.attr#configChanges属性处理的配置时,才会调用此方法。请参阅javadoc! - user504342
谢谢,这对我也有效。 - Suniel

5
您可以在onCreate方法中检查onSavedInstanceState,如果它不为null,则表示这是配置更改。

好的,我现在知道如何做了,感谢您的出色答案! - Quentin Golsteyn
这对我来说是最容易的。谢谢。 - Sourabh

4
另一种方法是使用OrientationEventListener。可以这样使用:
 OrientationEventListener mOrientationEventListener = new OrientationEventListener(
            this, SensorManager.SENSOR_DELAY_NORMAL) {

        @Override
        public void onOrientationChanged(int orientation) {
            //checking if device was rotated
            if (orientationPortrait != isPortrait(orientation)) {
                orientationPortrait = !orientationPortrait;
                Log.d(TAG, "Device was rotated!");
            }
        }
    };

检查设备方向:

private boolean isPortrait(int orientation) {
    return (orientation >= (360 - 90) && orientation <= 360) || (orientation >= 0 && orientation <= 90);
}

不要忘记启用和禁用监听器:

if (mOrientationEventListener != null) {
        mOrientationEventListener.enable();
    }

if (mOrientationEventListener != null) {
        mOrientationEventListener.disable();
    }

我认为配置更改是一件事,在这种情况下,onConfigurationChanged 是正确的方法。但如果您锁定了方向更改并仍然想要得到通知,则方向监听器是最好的方法。谢谢 Bogdan。 - Murciegalo84

2
通常情况下,屏幕方向的改变会调用OnCreate()方法,除非你已经做了一些特殊处理。你可以在这里添加逻辑代码。

当然有道理,但如何确保每次调用onCreate时不重新加载缓存?例如,在电话后重新创建活动后,可能会简单地调用onCreate,并且在这种情况下不应重新加载缓存。 - Quentin Golsteyn
1
@Poplitou 请参考siik的答案关于onSavedInstanceState,还有https://dev59.com/Z2855IYBdhLWcg3w5Igb - sealz

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