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
}