在方向更改(屏幕旋转)时,EditText都显示相同的值,因为它们共享相同的ID

时间:2014-05-31 08:08:58

标签: android

我有以下XML定义,我以编程方式实例化多次,具体取决于数据库中的项目数。每个实例都是TableRow,稍后会添加到TableLayoutTableLayout在别处定义(在活动XML定义中)。

group_editblinds.xml

<?xml version="1.0" encoding="utf-8"?>
<TableRow xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/group_editblindschedule"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:paddingBottom="10dip" >

    <TextView
      android:id="@+id/textView1"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:layout_weight="1"
      android:text="Round" />

    <EditText
      android:id="@+id/editText2"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:ems="2"
      android:hint="Small"
      android:inputType="number"
      android:layout_weight="4"
      android:layout_marginRight="10dip"
      android:text="0" />

    <EditText
      android:id="@+id/name"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:ems="2"
      android:hint="Big"
      android:inputType="number"
      android:layout_weight="4"
      android:layout_marginRight="10dip"
      android:paddingRight="6dip"
      android:text="0" >
    </EditText>

    <CheckBox
      android:id="@+id/checkBox1"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:layout_weight="1" />

</TableRow>

我从其他答案中读到,因为我多次实例化相同的视图,每个视图包含相同的Id。

我的活动非常简单。唯一的额外部分是它有一个用户定义的对象BlindSchedule,用于填充EditView。这必须在方向改变时保留。您可以将此活动视为数据库创建/更新,具体取决于我们如何进行活动。

public class EditBlindScheduleActivity extends Activity {

  private TableLayout table;
  private BlindSchedule bs;
  private EditText name;

  boolean creating;

  @Override
  protected void onCreate(Bundle savedInstanceState) 
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_edit_blind_schedule);

    if (savedInstanceState == null)
    {
      bs = (BlindSchedule) getIntent().getSerializableExtra("blindSchedule");
    }

    table = (TableLayout) findViewById(R.id.editblindtable);
    name = (EditText) findViewById(R.id.nameEdit);

    if (bs == null) {
      creating = true;
    } else {
      creating = false;
    }

    if (creating) 
    {
      setTitle("Create Blind Schedule");

      for(int i = 1; i < 26; ++i)
      {
        TableRow row = (TableRow) View.inflate(this, R.layout.group_editblindschedule, null);
        TextView tv = (TextView) row.getChildAt(0);
        tv.setText("" + i);
        table.addView(row);
      }
    } 
    else 
    {
      setTitle("Edit Blind Schedule");

      name.setText(bs.getName());

      int i = 1;
      for (BlindLevel level : bs.getBlindLevels())
      {
        TableRow row = (TableRow) View.inflate(this, R.layout.group_editblindschedule, null);
        TextView tv = (TextView) row.getChildAt(0);
        tv.setText("" + i);
        EditText et = (EditText) row.getChildAt(1);
        et.setText("" + level.getSmallBlind());
        et = (EditText) row.getChildAt(2);
        et.setText("" + level.getBigBlind());
        CheckBox cb = (CheckBox) row.getChildAt(3);
        cb.setChecked(true);
        table.addView(row);
        ++i;
      }
    }
  }

  @Override
  protected void onRestoreInstanceState(Bundle savedInstanceState) {
      super.onRestoreInstanceState(savedInstanceState);
      bs = (BlindSchedule) savedInstanceState.getSerializable("blindSchedule");
  }

  @Override
  protected void onSaveInstanceState(Bundle outState) {
    if (bs != null) {
      outState.putSerializable("blindSchedule", bs);
    }
    super.onSaveInstanceState(outState);
  }
}

当我进入编辑BlindSchedule的活动时,值看起来像:

1 2
2 4 
4 8
16 32
100 200

当我旋转屏幕时,我得到:

100 200
100 200
100 200
100 200
100 200

同样,我相信这是因为我的所有视图都具有相同的Id,因为相同的XML资源被多次实例化。解决这个烦恼的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

我同意Vilen Melkumyan你应该使用ListViewListViewAdapter一开始可能会令人生畏,但当您学习使用它们时,它们将被证明是强大的工具。

要回答您的问题,如果您想坚持使用TableLayout,可以在AndroidManifest.xml文件中将以下内容添加到您的活动中:

            android:configChanges="keyboardHidden|orientation|screenSize" >

这将阻止在方向状态更改后重新加载Activity