更改屏幕方向时EditText中的值错误

时间:2011-07-19 10:36:31

标签: android android-edittext

我很困惑。

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

问题在于我改变屏幕方向。所有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);
}

6 个答案:

答案 0 :(得分:8)

我遇到了同样的问题。我不知道为什么会这样;它发生在我的一个活动中,而不是在我认为几乎相同的另一个活动中。我没有广泛调查它。

但是,我想出了一个解决方法:onResume()而不是在onCreate()中填充EditTexts。(我也尝试在onStart中填充它们,但之后我我也有同样的错误。)我希望这对你或其他读这个帖子的人都有用。

答案 1 :(得分:2)

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

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

Activity Lifecycle

答案 2 :(得分:1)

小心参考。也许你正在“以编程方式”创建所有的EditText,然后只修改最后一次。

发布代码会很有帮助。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

不确定是否是这种情况,但我能够通过删除

解决此问题
android:textIsSelectable="true"

来自我的XML布局。

答案 5 :(得分:0)

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

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