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

时间:2013-10-07 20:59:05

标签: android android-edittext bundle

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

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

修改

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

4 个答案:

答案 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);

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