我读到Android会在应用程序即将停止或终止时自动保存EditText
个对象的内容。但是,在我的应用中,当屏幕方向发生变化时,EditText
的内容会丢失。
这是正常行为吗?我是否必须使用onSaveInstanceState
/ onRestoreInstanceState
手动保存/恢复其内容?或者是否有一种更简单的方法来告诉Android保存它还原它?
修改:
我以编程方式创建EditText
对象,而不是XML。事实证明这与问题有关(见下面接受的答案)。
答案 0 :(得分:25)
这不是正常行为。
首先,确保在布局XML中为您的EditText
控件分配了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"
来尝试完成此操作,这是错误的方法。
答案 1 :(得分:2)
你可以在xml布局中使用android:freezesText="true"
吗?
答案 2 :(得分:2)
我发现在onSaveInstanceState上保存对象的最简单方法是实现serializable并放入bundle
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putSerializable("myObj", myObj);
}
其中myObj类实现了serializable和inCreate()方法
if (savedInstanceState != null && savedInstanceState.getSerializable("myObj") != null) {
myObj = ((MyObj) savedInstanceState.getSerializable("myObj"));
}
答案 3 :(得分:2)
一个可能的原因是你覆盖了onSaveInstanceState但你忘记为超类调用相同的
super.onSaveInstanceState(outState);
活动中的所有视图的状态都是自动保存的,除非您覆盖此功能。即使这很明显,也可能出错。