-2

我有一个应用程序,当单击按钮时会添加到总变量中。但是,如果我转动手机使布局变成水平布局,所有值都会被重置,并且知道为什么会这样以及如何停止它?

谢谢!

4

3 回答 3

3

当您移动设备时,设备的方向状态会从纵向变为横向或从横向变为纵向。在此方向更改中,您的 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 开发指南并遵循良好实践。

于 2013-08-08T23:28:28.143 回答
1

您需要将变量保存在 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);

}
于 2013-08-08T23:28:09.780 回答
1

发生这种情况是因为 Android 在任何配置更改(包括屏幕重定向)期间处理活动的正常方式是销毁活动并重新创建它。如指南主题处理运行时更改中所述,您可以通过多种方式处理它。“Android方式”是通过覆盖onSaveInstanceStateonRestoreInstanceState方法来保存你的Activity的状态信息。有关如何使用这些方法的详细信息,请参阅指南主题重新创建活动

防止此问题的另一种方法是告诉 Android 您的活动将在内部处理配置更改。为此,您可以在活动清单中添加android:configChanges="orientation"标记<activity>并覆盖活动的onConfigurationChanged方法以实际处理更改。

于 2013-08-08T23:28:22.347 回答