如何在Android上避免屏幕方向改变时重新启动活动

70

我正在创建一个Android应用程序,其中我在画布上绘制视图。当设备的方向发生变化时,活动会重新启动,而我不希望它重新启动。

我该如何避免在设备方向发生变化时重新启动活动?

17个回答

100

有很多方法可以做到这一点,但是如此处所示,使用

android:configChanges="keyboardHidden|orientation|screenSize"

让你监听配置更改,你可以通过重写onConfigurationChanged并调用setContentView来响应这些更改。

这是我一直在使用的方法,但我很想知道其他人的想法。


在我的情况下,我不应该使用setContentView,并且onConfigurationChanged应该为空,只调用super。 - M D P

22

在 AndroidManifest.xml 中像这样定义您的活动:

   <activity
        android:name="com.name.SampleActivity"
        android:configChanges="keyboardHidden|orientation|screenSize"
        android:icon="@drawable/sample_icon"
        android:label="@string/sample_title"
        android:screenOrientation="portrait" >
    </activity>

3
这是误导性的。android:screenOrientation="portrait"将始终强制使用纵向屏幕方向。不要包含这行代码。 - Daniel C Jacobs

10

请检查您的Android清单文件中是否在活动上编写了android:configChanges="orientation"


2
请注意,大多数情况下这不是您想要做的。对于大多数应用程序,正确的方法是在onSaveInstanceState()中编写配置,并在配置更改后将其恢复回来。 - jjb
谢谢。但我是在按钮的onclick事件上绘制画布,那么我该如何保存画布的状态呢? - chirag

8

对于 xamarin 用户,

为了避免在 Android 设备方向变化时应用程序重新启动,请添加以下代码:

ConfigurationChanges = Android.Content.PM.ConfigChanges.Orientation | Android.Content.PM.ConfigChanges.ScreenSize

将Activity属性添加到所有Activity类的属性中。例如,以下是我的演示代码:

    [Activity(Label = "DemoApp", ConfigurationChanges = Android.Content.PM.ConfigChanges.Orientation | Android.Content.PM.ConfigChanges.ScreenSize)]
    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsApplicationActivity
    {
        protected override void OnCreate(Bundle bundle)
        {
        //Some code here
        }
    }

1
至少提到这是Xamarin C#代码而不是Java。 - SadeepDarshana
1
谢谢。非常有帮助。只需注意一点:答案说要在MainActivity中添加ConfigurationChanges。实际上,您应该在项目中的每个活动中添加此代码以防止其重新启动,而不仅仅是MainActivity。 - Metalogic

8

我尝试在activity标签中写入android:configChanges="keyboardHidden|orientation|screenSize",但它不起作用。

我尝试了很多方法,但是直到我在所有应用程序活动中添加了android:configChanges="keyboardHidden|orientation|screenSize",它才能完美地工作。


7
在你的activity中添加android:configChanges="keyboardHidden|orientation"

6
我建议使用Fragments。你可以简单地使用setRetainInstance(true)来通知你想要保留你的Fragment。

这并不会阻止主活动和片段视图被销毁。 - Louis CAD

3

在清单文件中为所有活动添加以下内容。

android:configChanges="orientation|screenSize"

例子:

<activity android:name=".activity.ViewActivity"
        android:label="@string/app_name"
        android:configChanges="orientation|screenSize"/>

2

1
在你的 AndroidManifest.xml 文件中声明此内容。
<activity android:name=".complex_examples.VideoPlayerActivity"
            android:configChanges="keyboard|keyboardHidden|orientation
                                  |screenSize|screenLayout|smallestScreenSize|uiMode"
            android:launchMode="singleTop"/>

但要注意Android开发者文档指出,只有在没有更好的选择时才应该这样做。

注意:应避免使用此属性,并仅在没有其他选择时使用。请阅读“处理运行时更改”以获取有关如何正确处理由于配置更改而导致的重启的更多信息。

如果您确定要这样做,可以在onConfigurationChanged()方法中自行处理配置更改。


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