Android,当我旋转设备时如何不破坏活动?


80

我有一个仅适用于纵向模式的应用程序,并且我已在清单文件中针对每项活动将其定向为纵向进行了更改。但是,当我旋转设备时,活动将重新创建。如何不破坏活动?


1
通常建议不要这样做,您可以尝试使用类似以下方式的程序来设置应用程序的方向:setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
隐身直升机2010年

7
为什么会反对?假设我们有一个需要2秒钟才能运行的服务。如果活动每次都销毁,那么该服务将每次都保持运行,而我只需要运行一次即可。
Mohamed Mansour

Answers:


130

对于API 12以下:添加

android:configChanges="orientation"

如果您的目标是API 13或更高版本,请添加“ screenSize” 因为只要方向改变,屏幕尺寸也会随之改变,否则新设备将继续破坏您的活动。有关使用“ screenSize”的更多信息,请参见下面的Egg答案。

android:configChanges="orientation|screenSize"

您在AndroidManifest.xml中的活动。这样,您的活动将不会自动重新启动。请参阅文档以获取更多信息


该活动再次重新启动。我不知道在活动旋转时执行所有必须完成的工作有什么意义,即使它实际上并没有旋转。有没有一种方法可以禁用传感器发送给操作系统的有关旋转或类似问题的消息,以从根本上解决此问题?
Vasil

6
您在什么设备上编程?记住,例如滑出键盘也可以重新启动您的活动...(如果这是将confChanges设置为“ keyboard | keyboardHidden | orientation”的原因)

2
这将禁用布局更改。我该如何解决?
Remian8985 2015年

1
该解决方案解决了销毁和创建活动,但解决了布局更改的方法。我的意思是说当改变方向时,加载相应的布局。
sandeepmaaram 2015年

有没有一种方法来以编程方式设置android:configChanges参数,而不是在清单文件中?
CodyF '16

108

氟林在官方文件中说:

注意:如果您的应用程序的目标是API级别13或更高级别(由minSdkVersion和targetSdkVersion属性声明),则还应该声明“ screenSize”配置,因为当设备在纵向和横向之间切换时,它也会更改。

因此,如果您的应用定位到API级别13或更高级别,则应改为设置以下配置:

android:configChanges="orientation|screenSize"


4
非常感谢!所有其他答案都错过了API级别13引入此screenSize的部分。你才救了我的命!:)
塔玛斯·巴尔塔(TamásBarta)

1
@egg谢谢youuuuuuu!:)这有帮助!
KarenAnne

1
很好的提示,在兼职时很难跟上文档。
wallerjake

1
+1好男人。感谢您为我们分享此解决方案。你救了我的日子。谢谢;)
Simon Dorociak

9

正确的解决方案是

android:configChanges="orientation|screenSize"

Android文档:

当前的可用屏幕尺寸已更改。这表示相对于当前长宽比的当前可用大小的更改,因此当用户在横向和纵向之间切换时,此更改将改变。但是,如果您的应用程序的目标是API级别12或更低级别,那么您的活动始终会自行处理此配置更改(即使在Android 3.2或更高版本的设备上运行,此配置更改也不会重新启动您的活动)。*


5

我把它弄乱了一点,然后想起了在清单文件中将configChanges放在应用程序级别而不是活动级别的问题。这是对我来说正确的代码。

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
        <activity android:name=".MainActivity"
                  android:configChanges="orientation|screenSize|keyboardHidden">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity> 
</application> 

2
您应该在帖子中分享代码,而不是图片。
朱尔斯·杜邦

编辑您的帖子,并以文本而非屏幕截图的形式显示实际的清单代码。其他人则无法从您的图像中复制和粘贴。有关详细信息,请参见此处。谢谢。

1

现在,Android支持拆分屏幕(在Android术语中为“多窗口”),您可能还希望添加screenSize | smallestScreenSize | screenLayout | orientation。因此,要处理旋转和拆分屏幕,您需要在android:configChanges中添加类似内容

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
        <activity android:name=".MainActivity"
                  android:configChanges="orientation|screenSize|keyboardHidden|smallestScreenSize|screenLayout">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity> 
</application>


-1

写在清单中:

android:configChanges="orientation|screenSize|keyboardHidden"

并在解决您的问题的活动中覆盖此内容:

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

5
为什么要覆盖onConfigurationChanged方法并调用原始实现做任何有用的事情?
ricosrealm
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.