我想知道在Android设备旋转(即配置更改)时哪些方法被重写了?
onSaveInstanceState(...)
,onConfigurationChanged(...)
,onRestoreInstanceState(...)
- 是否类似于这样的方法呢?
对于整个与更改配置相关的过程,我也很感兴趣。谢谢。
我想知道在Android设备旋转(即配置更改)时哪些方法被重写了?
onSaveInstanceState(...)
,onConfigurationChanged(...)
,onRestoreInstanceState(...)
- 是否类似于这样的方法呢?
对于整个与更改配置相关的过程,我也很感兴趣。谢谢。
@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();
}
}
<activity
android:configChanges=["orientation"]
. . .
</activity>
当你旋转设备时,你的活动会重新创建,所有的变量都将重新初始化。因此,在这种情况下,如果你想要一些值在旋转时保持不变,你可以使用onSaveInstanceState()
来存储它们的状态,并通过检查Bundle是否为null,在onCreate()
中恢复它们。
if(savedInstanceState != null){
// get the restore value from the Bundle
}
onConfigurationChanged()
方法会在旋转设备时被调用 (请注意,只有在你的清单文件中选择了你想处理的配置项并使用 configChanges
属性后,此方法才会被调用)。从参数中可以获取新的设备配置信息。
如果不希望 Activity 在设备旋转时重新创建,则需要在 AndroidManifest
文件中的 activity 标签添加此行代码。
android:ConfigChanges="keyboardHidden|orientation"
关于在运行时配置更改期间保留对象:
onRetainNonConfigurationInstance()
方法,返回您想要保留的对象。getLastNonConfigurationInstance()
来恢复您的对象。Android 在由于配置更改而关闭您的 Activity 时,在 onStop() 和 onDestroy() 之间调用 onRetainNonConfigurationInstance()。您可以在 onRetainNonConfigurationInstance() 中返回任何需要以有效地恢复状态的对象。
如果您的应用程序从 Web 加载大量数据,则此方案可能非常有价值。如果用户更改设备的方向并且 Activity 重新启动,则您的应用程序必须重新获取数据,这可能会很慢。相反,您可以实现 onRetainNonConfigurationInstance()
返回一个携带数据的对象,然后使用 getLastNonConfigurationInstance()
在 Activity 再次启动时检索数据。
请查看保留对象以获取更多信息,您还可以在其上找到示例。
感谢您的阅读。
前往清单文件并添加: 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);
}