在Android程序中以编程方式禁用和启用活动的方向更改

9
我有一个应用程序可以进行一些后台工作。在后台工作运行时,会显示进度圈,如果在此期间旋转设备,则活动将被“重置”,我想避免这种情况发生。
出于这个原因,我决定在此过程中禁用方向。我看到了许多相关的线程,但没有一个有效的解决方案,至少对于我的情况来说是如此。
发布的解决方案是关于修正活动方向,但你必须面对这样一个事实:如果使用以下命令,则无法返回REVERSE方向:
getResources().getConfiguration().orientation

以上函数在测试中无论是PORTRAIT还是REVERSE_PORTRAIT情况下都返回SCREEN_ORIENTATION_PORTRAIT。

因此,最终我使用旋转值来处理问题,我的代码“禁用旋转”如下:

int rotation = getWindowManager().getDefaultDisplay().getRotation();

    switch(rotation) {
    case Surface.ROTATION_180:
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
        break;
    case Surface.ROTATION_270:
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);         
        break;
    case  Surface.ROTATION_0:
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        break;
    case Surface.ROTATION_90:
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        break;
    }

并且可以再次允许方向:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);

在Android 4.1.2的设备上,这个功能完美地运行,但在Android 4.2.1的设备上,它并没有按照预期工作。

我猜测在活动生命周期中管理旋转应该是一个普遍的问题,但我还没有找到合适的解决方案。也许我正在寻找错误的方向,所以任何帮助都非常受欢迎。

提前致谢, 伊万。


这实际上是你想要的:从 https://github.com/delight-im/Android-BaseLib/blob/master/Source/src/im/delight/android/baselib/Screen.java 调用 Screen.lockOrientation(this) - caw
4个回答

13
如果您想禁用手机的方向更改,则可以在清单中使用此代码。
<activity android:name=".class_name"

//如果您想要竖屏显示

android:screenOrientation="portrait" >

//如果您想要在横屏模式下查看屏幕

android:screenOrientation="landscape" >

如果您想让手机改变方向但又要防止进程重新启动,那么您可以在类中使用onConfigurationChanged方法:

@Override
public void onConfigurationChanged(Configuration newConfig) {
   // ignore orientation change
   if (newConfig.orientation != Configuration.ORIENTATION_LANDSCAPE) {
       super.onConfigurationChanged(newConfig);
   }
}

7
我不建议使用这段代码。如果不转发 onConfigurationChanged() 调用,就会出现 SuperNotCalledException 异常,导致应用程序崩溃(API 23)。 - TheOperator

1
尝试这个...
您的代码没有错误。我已经检查过了,是正确的。在onConfigurationChanged中使用该代码可能会产生差异,另外一件事是使用下面的代码来禁用活动重置。
<activity
    android:name="YourActivity"
    android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" android:windowSoftInputMode="adjustPan"/>  

0

简单:在Android清单中的Activity名称后添加一行代码即可

android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale

这对我有用。


0
你可以重写 on onConfiguratoinChanged 方法来禁用屏幕方向的更改:
@Override
public void onConfigurationChanged(Configuration newConfig) {
   // ignore orientation change
   if (newConfig.orientation != Configuration.ORIENTATION_LANDSCAPE) {
       super.onConfigurationChanged(newConfig);
   }
}

不要忘记在AndroidManifest.xml文件中启用方向更改监听器:
<activity android:configChanges="orientation" >

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