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
中的文本不会加倍,而是在不同的文本之间混淆EditText
s.
尝试为每个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
}
见下文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
中的文本不会加倍,而是在不同的文本之间混淆EditText
s.
尝试为每个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
}