我的应用程序有一个有趣的小bug。当用户旋转屏幕时,我的活动中会丢失一些数据。是否有人知道为什么会出现这种情况?
我的应用程序有一个有趣的小bug。当用户旋转屏幕时,我的活动中会丢失一些数据。是否有人知道为什么会出现这种情况?
//Use onSaveInstanceState(Bundle) and onRestoreInstanceState
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// Save UI state changes to the savedInstanceState.
// This bundle will be passed to onCreate if the process is
// killed and restarted.
savedInstanceState.putBoolean("MyBoolean", true);
savedInstanceState.putDouble("myDouble", 1.9);
savedInstanceState.putInt("MyInt", 1);
savedInstanceState.putString("MyString", "Welcome back to Android");
// etc.
super.onSaveInstanceState(savedInstanceState);
}
//onRestoreInstanceState
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
// Restore UI state from the savedInstanceState.
// This bundle has also been passed to onCreate.
boolean myBoolean = savedInstanceState.getBoolean("MyBoolean");
double myDouble = savedInstanceState.getDouble("myDouble");
int myInt = savedInstanceState.getInt("MyInt");
String myString = savedInstanceState.getString("MyString");
}
当系统旋转时删除数据,以下是保存数据的方法。
默认情况下,当屏幕旋转时,您的活动将被销毁并重新启动。为确保不会丢失任何数据,您需要使用生命周期方法正确保存和恢复数据。请参见保存持久状态。
EditText
的内容。 - RivieraKidEditText
有一个名为freezesText
的属性,默认值为true
。官方文档链接:https://developer.android.com/reference/android/widget/TextView.html#attr_android:freezesText。 - stone其他人已经提供了代码。所以我将在此基础上添加更多细节。
当屏幕旋转时,Activity的配置会发生变化,因此系统会寻找更适合该Activity的资源。为此,系统会杀死Activity的实例并重新创建一个新的Activity实例。
系统尝试使用称为实例状态的旧Activity实例的一组保存数据来重新创建实例。InstanceState是存储在Bundle
对象中的键值对集合。
默认情况下,系统会将View对象保存在Bundle中,例如:
如果您想要存储更多数据以在方向改变后继续使用,您应该重写onSaveInstanceState(Bundle savedInstanceState)
方法。
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// Save the user's current game state
savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
// Always call the superclass so it can save the view hierarchy state
super.onSaveInstanceState(savedInstanceState);
}
如果您不小心忘记调用super.onSaveInstanceState(savedInstanceState),默认行为将不起作用, 即
EditText
中的文本不会保存。如果您不相信我,请查看这个
很多人包括我都感到困惑。我应该选择
onCreate(Bundle savedInstanceState)
还是
onRestoreInstanceState(Bundle savedInstanceState)
没有关系。两种方法都在参数中接收相同的bundle。唯一的区别是您需要在onCreate(Bundle savedInstanceState)
方法中提供一个null检查。但是如果您要使用onRestoreInstanceState(Bundle savedInstanceState)
,请小心使用
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
// Always call the superclass so it can restore the view hierarchy
super.onRestoreInstanceState(savedInstanceState);
// Restore state members from saved instance
mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
}
始终调用
super.onRestoreInstanceState(savedInstanceState)
,以便系统默认地恢复View层次结构
这是对@jaisonDavis的实用回答的一个变化版本:
int myInt;
String myString;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_verses);
if (savedInstanceState == null) {
Intent intent = getIntent();
myInt = intent.getIntExtra("MyIntIntentKey", DEFAULT_INT);
myString = intent.getStringExtra("MyStringIntentKey", DEFAULT_STRING);
} else { // savedInstanceState has saved values
myInt = savedInstanceState.getInt("MyIntKey");
myString = savedInstanceState.getString("MyStringKey");
}
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
savedInstanceState.putInt("MyIntKey", myInt);
savedInstanceState.putString("MyStringKey", myString);
super.onSaveInstanceState(savedInstanceState);
}
Intent
进行初始化,但之后它们将从savedInstanceState
进行初始化(例如当屏幕方向改变时)。<activity android:name=".MainActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
>
https://developer.android.com/topic/libraries/architecture/viewmodel
In the AndroidManifest.xml add the following code
<activity android:name=".MainActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
>
It works for me
Fragment
而不是标准的 Activity
。setRetainInstance(true);
onCreate()
方法中调用此方法。configChanges解决了我的问题
<activity android:name=".MyActivity"
android:configChanges="orientation|screenSize|screenLayout|keyboardHidden"
android:label="@string/app_name">