13

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

这是正常行为吗?然后我是否必须使用 / 手动保存/恢复其onSaveInstanceState内容onRestoreInstanceState?或者有没有更简单的方法告诉Android保存它并恢复它?

编辑

EditText我以编程方式创建对象,而不是在 XML 中。事实证明这与问题有关(请参阅下面接受的答案)。

4

4 回答 4

28

这不是正常行为。

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

于 2013-10-07T21:18:45.387 回答
2

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

于 2013-10-07T21:49:55.633 回答
2

我发现在 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"));
}
于 2014-02-21T06:34:00.360 回答
2

一个可能的原因是您覆盖 onSaveInstanceState 但您忘记为超类调用相同的

super.onSaveInstanceState(outState);

除非您覆盖此功能,否则活动中所有视图的状态都会自动保存。即使这很明显,也可能出现错误。

于 2016-05-19T06:36:02.373 回答