Android如何防止屏幕旋转时刷新页面。

3
我有两个文件,分别是layout/activity_main.xmllayout-land/activity_main.xml。当我改变屏幕方向时,活动会重新加载。
我尝试使用这段代码:android:configChanges="keyboardHidden|orientation",它可以让活动不会重新加载,但问题是布局没有从layout/activity_main.xml切换到layout-land/activity_main.xml
如何在不刷新活动的情况下从layout/activity_main.xml切换到layout-land/activity_main.xml

可能是一个重复的问题:Android屏幕方向改变时会调用onCreate方法 - Jared Burrows
是的,我明白了,但我的问题有所不同。就像我说的android:configChanges="keyboardHidden|orientation"是有效的,但布局没有从layout/activity_main.xml更改为layout-land/activity_main.xml - Zero_73
2个回答

6
通过声明 android:configChanges="orientation|screenSize",您指示 Activity Manager 不重新启动您的活动,并让您通过 onConfigurationChanged() 处理配置更改。

如果您的应用程序不需要在特定配置更改期间更新资源,并且您有性能限制需要避免活动重新启动,则可以声明您的活动自己处理配置更改,从而防止系统重新启动您的活动。

来源: http://developer.android.com/guide/topics/resources/runtime-changes.html 这意味着在配置更改时将跳过 onCreate(),并且您无法交换布局(因为 onCreate() 是您重新创建视图的地方)。
在您的情况下,您想要更改布局,因此除了刷新您的活动之外别无选择,这意味着删除 android:configChanges="orientation|screenSize"。如果您想保留状态,则可以保存并检查传递给您的 onCreate()Bundle,以相应地恢复状态。
@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    // set your layoutId according to landscape/portrait
    setContentView(layoutId);
    if (savedInstanceState != null) {
        // restore your state here
    }
    ...
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    // save your state here
}

更多参考资料:http://developer.android.com/training/basics/activity-lifecycle/recreating.html


谢谢您的解释,我现在明白了我的情况。我不能使用这个代码 android:configChanges="orientation|screenSize",因为它会阻止我为新方向创建新的布局,但是如何保存我的状态呢?抱歉,我不理解“保存状态”的部分,我是Android开发的新手。 - Zero_73
请查看此培训文档:http://developer.android.com/training/basics/activity-lifecycle/recreating.html - hidro
天才!谢谢你 - Sarah Khan

4

尝试使用以下内容:

android:configChanges="orientation|screenSize"

在您的Android清单文件中,在<activity>标签中添加代码以限制活动的重新加载。

正如您在我的问题中所看到的,这个代码是有效的,但我的问题是,如果我使用这个代码,布局不会从layout/activity_main.xml切换到layout-land/activity_main.xml - Zero_73

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