Android EditText在方向更改时表现异常

Android EditText在方向更改时表现异常,android,android-layout,android-edittext,Android,Android Layout,Android Edittext,请参阅以下活动: public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); LinearLayout l

请参阅以下
活动

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.edittext\u布局

<?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
中的文本不会加倍,而是在不同的
EditText
s之间混淆。

尝试为每个视图设置一些ID

例如:

view.setId(id);  
或使用

onSaveInstanceState() - onRestoreInstanceState()

用于保存信息。

问题是您的活动在每个方向上都会重新创建,并且保存的实例数据被Android错误处理。您可以通过为动态创建的视图设置id来避免此问题,也可以 重写onSaveInstanceState方法以在EditText中保存类似文本的数据,并在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
}

@B.Kemmer我不知道你所说的“在简历中遇到”是什么意思。@B.Kemmer没有进一步的参考资料,我发布的代码是完整的,没有遗漏任何内容。你是否使用不同的xml进行横向和纵向复制?我用这个android:configChanges=“orientation | screenSize”运行你的代码,它可以工作。它到底能不能用?这并不能说明确切的原因1.他问的是关于复制edittext的问题。它可以解决我提到的问题,并防止android为视图分配错误的值。谢谢,这实际上阻止了这种效果的发生。你知道为什么吗?@抗坏血酸,正如我在回答中提到的,没有id的android会将最后读取的值分配给所有视图。为了避免这种情况,您可以自己处理数据或为每个视图设置不同的id。@Ascorbin它与android的内部机制有关。我想这是一只虫子。在重新创建时,manager只能正确标识ID为的视图。我认为他们有一个字段用于一种视图(或类似的),最后一个视图在保存时重写它字段。所以所有相同的视图在恢复时都会收到该值。。。然而,这些观点甚至不应该被保留。方向改变后,它们应该总是“从头开始”创建的,对吗?
@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);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    //do nothing
}