При изменении ориентации (поворот экрана) все тексты EditText показывают одно и то же значение, потому что они имеют одинаковый идентификатор

У меня есть следующее определение XML, которое я создаю программным образом много раз, в зависимости от количества элементов в базе данных. Каждый экземпляр TableRow который позже добавляется к TableLayout, TableLayout определяется в другом месте (в определении 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>

Из других ответов я прочитал, что, поскольку я много раз создавал один и тот же вид, каждый вид содержит один и тот же идентификатор.

Моя деятельность довольно проста. Единственным дополнительным элементом является то, что он имеет определенный пользователем объект, BlindSchedule, который используется для заполнения EditViews. Это должно быть сохранено при изменении ориентации. Вы можете думать об этом задании как о создании / обновлении базы данных в зависимости от того, как мы попали в задание.

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

Опять же, я считаю, что это потому, что все мои представления имеют одинаковый идентификатор из-за того факта, что один и тот же ресурс XML был создан несколько раз. Как правильно исправить это раздражение?

1 ответ

Решение

Я согласен с Виленом Мелкумяном, что вы должны использовать ListView, ListView а также Adapter поначалу может быть пугающим, но они окажутся мощными инструментами, когда вы научитесь их использовать.

Чтобы ответить на ваш вопрос, если вы хотите придерживаться TableLayout, вы можете добавить следующее к вашей деятельности в AndroidManifest.xml файл:

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

Это предотвратит Activityперезагружаться после изменения состояния ориентации.

Другие вопросы по тегам