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

Lui*_*ndo 11 android bundle android-edittext

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

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

编辑:

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

Mik*_* P. 25

这不是正常行为.

首先,确保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);
Run Code Online (Sandbox Code Playgroud)

这将解决您的问题.

如果失败,您需要自己保存和恢复状态.

onSaveInstanceState像这样覆盖:

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putString("textKey", mEditText.getText().toString());
}
Run Code Online (Sandbox Code Playgroud)

然后恢复OnCreate:

public void onCreate(Bundle savedInstanceState) {
    if(savedInstanceState != null)
    {
        mEditText.setText(savedInstanceState.getString("textKey"));
    }
}
Run Code Online (Sandbox Code Playgroud)

此外,请不要android:configChanges="orientation"试图这样做,这是错误的方式去.