IllegalStateException при добавлении представления в TableRow на Android

В настоящее время я создаю приложение, которое добавляет строки в существующую таблицу. Код выглядит следующим образом:

TextView exampleTextView = (TextView) messageView.findViewById(R.id.exampleLabel);
exampleTextView.setText(locationMsg.getMessageContent());

TableRow tr = (TableRow) messageView.findViewById(R.id.tableRow);
tr.addView(exampleTextView);
table.addView(tr);

В XML у меня есть макет таблицы, который находится внутри linearLayout, который находится внутри frameLayout, который находится внутри tabwidget, и он выглядит так:

<TableLayout
 android:id="@+id/distanceTable" 
 android:layout_height="wrap_content"
 android:layout_width="wrap_content"
 android:layout_gravity="center"
 android:background="#DDDDDD"
 android:stretchColumns="1" >
 <TableRow>
  <TextView
  android:textColor="#000000"
  android:text="@string/label_device"
  android:layout_gravity="center"
  android:padding="3dip"
  android:textSize="18sp" />

  <TextView
  android:textColor="#000000"
  android:text="@string/label_distance"
  android:layout_gravity="center"
  android:padding="3dip"
  android:textSize="18sp" />
  <TextView
  android:textColor="#000000"
  android:text="@string/label_time"
  android:layout_gravity="center"
  android:padding="3dip"
  android:textSize="18sp" />
 </TableRow>
 <TableRow android:id="@+id/tableRow" >
  <TextView
  android:id="@+id/exampleLabel"
  android:textColor="#000000"
  android:layout_gravity="center"
  android:padding="3dip"
  android:textSize="18sp" />
  <TextView
  android:id="@+id/anotherExampleLabel"
  android:textColor="#000000"
  android:layout_gravity="center"
  android:padding="3dip"
  android:textSize="18sp" />
  <TextView
  android:id="@+id/someOtherLabel"
  android:textColor="#000000"
  android:layout_gravity="center"
  android:padding="3dip"
  android:textSize="18sp" />
 </TableRow>
</TableLayout>

Создание этих меток работает нормально, но когда я хочу добавить текст в строку, приложение падает, и я получаю «IllegalStateException», подробное сообщение:

У указанного потомка уже есть родитель. Сначала вы должны вызвать removeView() для родителя дочернего элемента.

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


person Lars    schedule 31.01.2011    source источник


Ответы (2)


ПримерLabel, который вы добавляете в свой код в tableRow, вы уже добавили в файле XML к той же таблице.

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

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

В вашем руководстве я не могу найти текстовое представление, которое уже добавлено в таблицу в файле xml?

person Community    schedule 31.01.2011
comment
Я попытался определить метку уже в XML, потому что столкнулся с ошибкой при определении ее в коде. Я укажу эту ошибку в новом Вопросе. Спасибо! - person Lars; 31.01.2011

Ваше текстовое представление уже является дочерним элементом другого представления. Вы не можете просто изменить родителя — вы должны удалить представление от одного родителя и добавить его к другому.

Присмотревшись, вам просто не нужно вручную добавлять конкретное текстовое представление в строку таблицы — оно уже есть в соответствии с вашим xml.

Метод addView() обычно вызывается для вновь созданных представлений, а не для тех, которые вы определяете в xml.

person Vladimir Ivanov    schedule 31.01.2011