【问题标题】:EditText behaving strange on orientation changeEditText 在方向更改时表现奇怪
【发布时间】:2015-07-09 21:26:42
【问题描述】:

见下面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 看起来像这样:

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

更让我困惑的是,当使用

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

而不是从布局中膨胀它。

那里发生了什么?

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

编辑:这不是 this question 的重复,因为在我的情况下,EditText 中的文本不会翻倍,而是在不同的 EditTexts 之间混淆。

【问题讨论】:

  • @B.Kemmer 我不知道你所说的“遇到 onResume”是什么意思。
  • @B.Kemmer 没有进一步的参考,我贴的代码是完整的,没有遗漏。
  • 横向和纵向使用不同的xml吗?
  • 我用这个 android:configChanges="orientation|screenSize" 运行你的代码,它可以工作。它是否有效?

标签: android android-layout android-edittext


【解决方案1】:

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

例如:

view.setId(id);  

或者使用

onSaveInstanceState() - onRestoreInstanceState()

用于保存信息。

【讨论】:

  • 聪明的主意。可以解决我提到的问题,防止android给view赋值错误。
  • 谢谢,这实际上阻止了效果的发生。你知道为什么吗?
  • @Ascorbin 正如我在我的回答中提到的,没有 id 的 android 将它读取的最后一个值分配给所有视图。为了防止您可以自己处理数据或为每个视图设置不同的 id。
  • @Ascorbin 和android内部机制有关。我认为这是一个错误。在重新创建时,经理只能正确识别具有 ID 的视图。我认为他们有一个字段用于一种视图(或类似的视图),最后一个视图在保存时重写它。因此,所有相同的视图在恢复时都会收到该值...恕我直言。
  • @Tronum 视图甚至不应该被保留。改变方向后,它们应该总是“从头开始”创建的,对吧?
【解决方案2】:

问题是您的活动在每个方向上重新创建,并且保存的实例数据被 Android 错误处理。您可以通过为动态创建的视图设置 id 来避免它,或者您可以 覆盖 onSaveInstanceState 方法以将数据(如文本)保存在 edittexts 中,并在 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
}

【讨论】:

  • 这不是确切的原因..他询问edittext settext的重复
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多