EditText不会自动保存在屏幕方向更改

我读到,当一个应用程序即将被停止或杀死时,Android会自动保存EditText对象的内容。 但是,在我的应用程序中,当屏幕方向改变时, EditText的内容会丢失。

这是正常的行为? 然后,我必须手动保存/恢复其onSaveInstanceState / onRestoreInstanceState内容? 还是有一个更简单的方法来告诉Android保存它结束还原呢?

编辑

我以编程方式创buildEditText对象,而不是使用XML。 事实certificate这与问题有关(见下面的接受答案)。

Related of "EditText不会自动保存在屏幕方向更改"

这不是正常的行为。

首先,确保您在布局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"来尝试完成此操作,这是错误的方法。

我发现在onSaveInstanceState上保存一个对象最简单的方法是实现可串行化和放入包中

 @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")); } 

你可以在xml布局中使用android:freezesText="true"吗?

一个可能的原因是你重写onSaveInstanceState,但你忘记调用超类的相同

super.onSaveInstanceState(outState);

活动中所有视图的状态都是自动保存的,除非您覆盖此function。 即使这是显而易见的,错误也是可能的。