我有一个应用程序,当单击按钮时会添加到总变量中。但是,如果我转动手机使布局变成水平布局,所有值都会被重置,并且知道为什么会这样以及如何停止它?
谢谢!
当您移动设备时,设备的方向状态会从纵向变为横向或从横向变为纵向。在此方向更改中,您的 Activity 的onCreate
方法每次都会被调用。因此,您的 Activity 中的值正在被重置。
有两种方法可以解决这个问题:
1)让 You Activity 为你管理它。
2)通过保存和恢复状态自己管理更改。
使用解决此问题的第一种方法:
只需在Manifest.xml
文件的活动节点中添加这一行。
android:configChanges="orientation|keyboardHidden|screenSize"
例如:
<activity
android:name=".MyMainActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:label="@string/app_name" >
使用第二种方式:
您可以覆盖这两种方法:
public void onSaveInstanceState(Bundle bundle) {
super.onSaveInstanceState(bundle);
//Manage your Data Explicitly here.
}
public void onRestoreInstanceState(Bundle bundle) {
super.onRestoreInstanceState(bundle);
//Manage your Data Explicitly here.
}
根据Android 开发指南编辑:
使用android:configChanges="orientation|keyboardHidden|screenSize"
不是一个好习惯。
从这个页面引用
Note: Using this attribute should be avoided and used only as a last resort. Please read Handling Runtime Changes for more information about how to properly handle a restart due to a configuration change.
我建议您遵循处理运行时更改的 Android 开发指南并遵循良好实践。
您需要将变量保存在 OnSaveInstanceState 中并将其恢复为 onRestoreInstnace 状态
例如;
@Override
public void onSaveInstanceState(Bundle bundle) {
bundle.putParcelableArrayList(PEOPLE, people);
super.onSaveInstanceState(bundle);
}
@Override
public void onRestoreInstanceState(Bundle bundle) {
super.onRestoreInstanceState(bundle);
people = bundle.getParcelableArrayList(PEOPLE);
}
发生这种情况是因为 Android 在任何配置更改(包括屏幕重定向)期间处理活动的正常方式是销毁活动并重新创建它。如指南主题处理运行时更改中所述,您可以通过多种方式处理它。“Android方式”是通过覆盖onSaveInstanceState
和onRestoreInstanceState
方法来保存你的Activity的状态信息。有关如何使用这些方法的详细信息,请参阅指南主题重新创建活动。
防止此问题的另一种方法是告诉 Android 您的活动将在内部处理配置更改。为此,您可以在活动清单中添加android:configChanges="orientation"
标记<activity>
并覆盖活动的onConfigurationChanged
方法以实际处理更改。