安卓配置已更改。

3

我想知道在Android设备旋转(即配置更改)时哪些方法被重写了?

onSaveInstanceState(...)onConfigurationChanged(...)onRestoreInstanceState(...) - 是否类似于这样的方法呢?

对于整个与更改配置相关的过程,我也很感兴趣。谢谢。

4个回答

6
根据Android开发者参考,你需要使用以下内容:
@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();
    }
}

更多信息请参见:http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange 您可能会对以下内容感兴趣:http://developer.android.com/guide/topics/manifest/activity-element.html#config 在此处,您可以找到所有配置监听器。
请记得将它们放入Android清单中:
<activity 
   android:configChanges=["orientation"]
   . . .
</activity>

希望这能帮到您……

感谢提供“处理运行时更改”链接。我目前正在使用onConfigurationChanged。 - lomza
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Gene Bo

5

当你旋转设备时,你的活动会重新创建,所有的变量都将重新初始化。因此,在这种情况下,如果你想要一些值在旋转时保持不变,你可以使用onSaveInstanceState()来存储它们的状态,并通过检查Bundle是否为null,在onCreate()中恢复它们。

if(savedInstanceState != null){
            // get the restore value from the Bundle
        }

onConfigurationChanged() 方法会在旋转设备时被调用 (请注意,只有在你的清单文件中选择了你想处理的配置项并使用 configChanges 属性后,此方法才会被调用)。从参数中可以获取新的设备配置信息。

如果不希望 Activity 在设备旋转时重新创建,则需要在 AndroidManifest 文件中的 activity 标签添加此行代码。

android:ConfigChanges="keyboardHidden|orientation"

我有一个问题。我有两个布局:一个是横屏,一个是竖屏。我有一个文本视图。我想在旋转时不要丢失已输入的文本。到目前为止,我使用了onConfigurationChanged,在其中基本上与onCreate中相同的内容。问题是,在onConfigurationChanged中我没有Bundle,无法保存/检索已输入的文本。当我同时使用onSaveInstanceState()和onConfigurationChanged()时,第一个没有任何效果。我不知道如何解决这个问题... - lomza
你可以在onCreate()方法中获取Bundle的值,并进一步使用它。 - Lalit Poptani
我明白了我的错误,我不必使用configChanges。我只需要重写onSaveInstanceState和onRestoreInstanceState。在那里,我可以保存/检索我的文本视图,布局配置处理是自动完成的,所以我不需要做其他任何事情。onConfigurationChanged覆盖了所有内容,我不需要如此复杂的逻辑。 - lomza
请注意保存的内容和方式。开发者文档中有这样一句话:“您永远不应该传递与Activity相关联的对象,例如Drawable、Adapter、View或任何其他与Context相关联的对象。如果这样做,它将泄漏原始Activity实例的所有视图和资源。(泄漏资源意味着您的应用程序仍然持有它们,它们无法被垃圾回收,因此可能会丢失大量内存。)”请参阅http://developer.android.com/guide/topics/resources/runtime-changes.html以获取更多信息。 - Wayne Phipps

3

关于在运行时配置更改期间保留对象:

  1. 覆盖 onRetainNonConfigurationInstance() 方法,返回您想要保留的对象。
  2. 当您的 Activity 再次创建时,调用 getLastNonConfigurationInstance() 来恢复您的对象。

Android 在由于配置更改而关闭您的 Activity 时,在 onStop() 和 onDestroy() 之间调用 onRetainNonConfigurationInstance()。您可以在 onRetainNonConfigurationInstance() 中返回任何需要以有效地恢复状态的对象。

如果您的应用程序从 Web 加载大量数据,则此方案可能非常有价值。如果用户更改设备的方向并且 Activity 重新启动,则您的应用程序必须重新获取数据,这可能会很慢。相反,您可以实现 onRetainNonConfigurationInstance() 返回一个携带数据的对象,然后使用 getLastNonConfigurationInstance() 在 Activity 再次启动时检索数据。

请查看保留对象以获取更多信息,您还可以在其上找到示例。

感谢您的阅读。


2

前往清单文件并添加: android:configChanges="orientation|screenSize"


该设置可以让应用程序在屏幕旋转或更改屏幕大小时保持活动状态,以避免重新启动活动。
 <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"
                    android:configChanges="orientation|screenSize"
                    />

在主活动中:复制并粘贴以下代码:

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


    }

完成了 -

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