我读到EditText
当应用程序即将停止或终止时,Android 会自动保存对象的内容。但是,在我的应用程序中,EditText
当屏幕方向改变时,内容会丢失。
这是正常行为吗?然后我是否必须使用 / 手动保存/恢复其onSaveInstanceState
内容onRestoreInstanceState
?或者有没有更简单的方法告诉Android保存它并恢复它?
编辑:
EditText
我以编程方式创建对象,而不是在 XML 中。事实证明这与问题有关(请参阅下面接受的答案)。
我读到EditText
当应用程序即将停止或终止时,Android 会自动保存对象的内容。但是,在我的应用程序中,EditText
当屏幕方向改变时,内容会丢失。
这是正常行为吗?然后我是否必须使用 / 手动保存/恢复其onSaveInstanceState
内容onRestoreInstanceState
?或者有没有更简单的方法告诉Android保存它并恢复它?
编辑:
EditText
我以编程方式创建对象,而不是在 XML 中。事实证明这与问题有关(请参阅下面接受的答案)。
这不是正常行为。
首先,确保EditText
在布局 XML 中为控件分配了 ID。
编辑1:它只需要一个ID,句号。如果您以编程方式执行此操作,除非它有 ID,否则它将丢失状态。
所以用这个作为一个快速而肮脏的例子:
// Find my layout
LinearLayout mLinearLayout = (LinearLayout) findViewById(R.id.ll1);
// Add a new EditText with default text of "test"
EditText testText = new EditText(this.getApplicationContext());
testText.setText("test");
// This line is the key; without it, any additional text changes will
// be lost on rotation. Try it with and without the setId, text will revert
// to just "test" when you rotate.
testText.setId(100);
// Add your new EditText to the view.
mLinearLayout.addView(testText);
这将解决你的问题。
如果失败,您需要自己保存和恢复状态。
onSaveInstanceState
像这样覆盖:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("textKey", mEditText.getText().toString());
}
然后恢复OnCreate
:
public void onCreate(Bundle savedInstanceState) {
if(savedInstanceState != null)
{
mEditText.setText(savedInstanceState.getString("textKey"));
}
}
另外,请不要android:configChanges="orientation"
用来尝试完成此操作,这是错误的方法。
你可以android:freezesText="true"
在xml布局中使用吗?
我发现在 onSaveInstanceState 上保存对象的最简单方法是实现可序列化并放入 bundle
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putSerializable("myObj", myObj);
}
其中 myObj 类实现可序列化并在 onCreate() 方法中
if (savedInstanceState != null && savedInstanceState.getSerializable("myObj") != null) {
myObj = ((MyObj) savedInstanceState.getSerializable("myObj"));
}
一个可能的原因是您覆盖 onSaveInstanceState 但您忘记为超类调用相同的
super.onSaveInstanceState(outState);
除非您覆盖此功能,否则活动中所有视图的状态都会自动保存。即使这很明显,也可能出现错误。