【问题标题】:Wrong value in EditText when changing screen orientation更改屏幕方向时 EditText 中的值错误
【发布时间】:2018-08-03 18:06:00
【问题描述】:

我很困惑。

我有一个包含 TextView 和 EditText 的布局 (LinearLayout)。 在我的代码中的某个地方,我(以编程方式)创建了一个 RelativeLayout,并将其中的几个 LinearLayouts 推入其中。我为每个人设置了一个 ID 和 TextView 和 EditText 的值。

问题是当我改变屏幕方向时。所有 EditText 控件都获得相同的值(来自最后一个 EditText)。如果我设置断点一切似乎都很好。我什至在调用 setContentView 之前检查了所有元素,并且所有值看起来都很好。

有什么想法吗?

以下是代码的相关部分:

@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  csWgs84 = getCoordinateSystem();
  wgs84C = getCoordinates();
  sView = new ScrollView(this);
  layout = getLayoutInflater().inflate(R.layout.location_calculator, null);

  View control1 = getLayoutInflater().inflate(R.layout.text_edit, null);
  control1.setId(1);
  TextView title1 = (TextView) control1.findViewById(R.id.title);
  title1.setText(csWgs84.axisInfo.yAxisAbbreaviation + " [°] :");
  EditText value1 = (EditText) control1.findViewById(R.id.input);
  value1.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL);
  value1.setText(cutValue(RSimpleFormatter.formatNumber(wgs84C.y, 1, 7, '.'), 12));
  RelativeLayout.LayoutParams viewLayoutParams1 = new RelativeLayout.LayoutParams
    (RelativeLayout.LayoutParams.FILL_PARENT,RelativeLayout.LayoutParams.WRAP_CONTENT );
      viewLayoutParams1.addRule(RelativeLayout.BELOW, group.getId());
  ((RelativeLayout) layout).addView(control1, viewLayoutParams1);

  View control2 = getLayoutInflater().inflate(R.layout.text_edit, null);
  control2.setId(2);
  TextView title2 = (TextView) control2.findViewById(R.id.title);
  title2.setText(csWgs84.axisInfo.xAxisAbbreaviation + " [°] :");
  EditText value2 = (EditText) control2.findViewById(R.id.input);
  value2.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL);
  value2.setText(cutValue(RSimpleFormatter.formatNumber(wgs84C.x, 1, 7, '.'), 12));
  RelativeLayout.LayoutParams viewLayoutParams2 = new RelativeLayout.LayoutParams
  (RelativeLayout.LayoutParams.FILL_PARENT,RelativeLayout.LayoutParams.WRAP_CONTENT );
     viewLayoutParams2.addRule(RelativeLayout.BELOW, control1.getId());
    ((RelativeLayout) layout).addView(control2, viewLayoutParams2);

  sView.addView(layout, scrollViewLayoutParams);
  setContentView(sView);
}

【问题讨论】:

  • 前段时间我也遇到过同样的问题。我不记得解决方案是什么,抱歉。如果我记得我会回答。如果您发布代码的相关部分,它可能会帮助其他人回答。

标签: android android-edittext


【解决方案1】:

我遇到了同样的问题。我不知道为什么会这样;它发生在我的一项活动中,但没有发生在我认为几乎相同的另一项活动中。不过我还没有深入研究过。

但是,我想出了一个解决方法:onResume() 而不是 onCreate() 中填充 EditTexts。(我也尝试在 onStart 中填充它们,但后来我遇到了同样的错误.) 我希望这对您或其他阅读此主题的人有用。

【讨论】:

    【解决方案2】:

    如果(当然通常非常聪明)默认的 onPause() 方法不能很好地处理您的活动被推送到内存并从中重新加载,那么您需要覆盖它。

    使用 onPause 将您以编程方式创建的字段的值保存在包中。在您的 onCreate 方法中检查是否存在 Bundle 并从中创建您的视图。

    Activity Lifecycle

    【讨论】:

    • 是的,我同意。但目前我不需要保存这些值。它应该工作,因为保存字段值的对象与屏幕方向之前相同(从该对象读取的 edittext 控件)。据我所知......它应该可以工作。
    【解决方案3】:

    小心引用。也许您正在“以编程方式”创建所有 EditText,然后只修改最后一个。

    发布代码会有帮助。

    【讨论】:

    • 我不这么认为。如果我检查控件,一切似乎都很好。 ID、值.. 一切。
    • 此外,问题不在于修改一个EditText,而是所有EditText控件都获得相同的值(来自最后一个)。
    【解决方案4】:

    检查thisthis。我认为您在方向更改期间没有保存 EditText 内容。

    【讨论】:

    • 是的,你是对的。目前我没有保存任何东西。但它仍然应该显示每个 EditText 的初始值而不是相同的值。
    【解决方案5】:

    根本问题是自定义布局中的视图(多次膨胀和添加)都具有相同的 ID(R.id.title 和 R.id.input)。当 Android 保存它们的状态时,每一个都会覆盖前一个,因为 ID 相同。

    您可以做的是定义一些唯一的IDs which are generated by Android 并以编程方式将它们分配给字段。

    【讨论】:

      【解决方案6】:

      不确定是否是这种情况,但我可以通过删除来解决此问题

      android:textIsSelectable="true"
      

      来自我的 XML 布局。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多