EditText 在方向改变时表现异常

EditText behaving strange on orientation change

见下文Activity

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        LinearLayout linearLayout = (LinearLayout) findViewById(R.id.root);

        for (int i = 0; i < 8; i++) {

            EditText editText = (EditText) LayoutInflater.from(this).inflate(R.layout.edittextlayout, null);
            editText.setText("#" + i);
            linearLayout.addView(editText);

        }

    }

}

布局R.layout.activity_main

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <LinearLayout
        android:id="@+id/root"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">


    </LinearLayout>

</LinearLayout>

和布局 R.layout.edittext_layout

<?xml version="1.0" encoding="utf-8"?>
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/editText"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

启动应用程序后,它看起来像我期望的那样:每个 EditText 都被它的索引填充。

旋转设备后,Activity 看起来像这样:

所有 EditText 都在那里,但它们都包含相同的文本。

更让我感到困惑的是,在使用

以编程方式创建 EditText 时,这 不会发生
EditText editText = new EditText(this)

而不是从布局中膨胀它。

那里发生了什么?

您可以查看我的示例并亲自尝试 here

编辑: 这不是 this question 的副本,因为在我的例子中,EditText 中的文本不会加倍,而是在不同的文本之间混淆EditTexts.

尝试为每个View设置一些ID。

例如:

view.setId(id);  

或使用

onSaveInstanceState() - onRestoreInstanceState()

用于保存信息。

问题是您的 activity 在每个方向上重新创建并保存的实例数据被 Android 处理错误。您可以通过为动态创建的视图设置一个 id 来避免它,或者您可以 重写 onSaveInstanceState 方法以像编辑文本中的文本一样保存数据,并在 onCreate 方法上恢复它,如下所示:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Check if we're recreating
    if (savedInstanceState != null) {
        // Restore value of edittext from saved state
            editText.setText(savedInstanceState.getString("edittext"));
    }
}

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    savedInstanceState.putString("edittext", editText.getText().toString());
    // Always call the superclass so it can save the view hierarchy state
    super.onSaveInstanceState(savedInstanceState);
}

如果您在执行此操作后遇到任何类似问题,请尝试覆盖 onRestoreInstanceState 方法以防止 android 执行您的工作。

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    //do nothing
}