Ошибка "указанный ребенок уже имеет родителя"
У меня есть страница, на которой будут отображаться запланированные на неделю игры для выбранного вида спорта. Выбранный вид спорта и неделя хранятся в файле XML, который открывается в начале страницы. Когда я нажимаю на ссылку следующей недели, в этот XML-файл сохраняется новое значение даты недели, а затем страница перезагружается. Теперь должны отображаться любые игры для этой следующей недели. Эти игры отображаются в виде таблицы, где я программно создаю строки по мере необходимости на странице.java. Вот упрощенный пример кода.
TableLayout tlGames = (TableLayout)findViewById(R.id.table_games);
for (int i = 0; i < gameCount; i++)
{
TableRow trGameHomeTeam = new TableRow(this);
TextView tvHomeTeamName = new TextView(this);
tvHomeTeamName.setText("Home Team Name Here");
tvHomeTeamName.setLayoutParams(new LayoutParam (LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
TextView tvHomeTeamScore = new TextView(this);
tvHomeTeamScore.setText("Home Team Score Here");
tvHomeTeamScore.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
trGameHomeTeam.addView(tvHomeTeamName);
trGameHomeTeam.addView(tvHomeTeamScore);
tlGames.addView(trGameHomeTeam,new TableLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT));
}
Когда я изначально запускаю свое приложение, игры на текущую дату отображаются правильно. Затем, как только я нажму на ссылку на следующей неделе, она должна перезагрузить эту страницу и отобразить игры для этой новой недели. Вместо этого я получаю сообщение об ошибке "У указанного дочернего элемента уже есть родитель. Сначала необходимо вызвать removeView() для родительского элемента дочернего элемента". Я добавил "tlGames.removeAllViews();" сразу после строки TableLayout tlGames, но это не исправило ошибку.
Единственное место, где у меня был "addView" - это создание строк таблицы или текстовых представлений в строках таблицы.
Может кто-нибудь сказать мне, что я делаю не так?
Спасибо
3 ответа
Я предполагаю, что при перезагрузке страницы для отображения игр на этой неделе вы используете разметчик для раздувания разметки деталей?
Инфлятор разметки - единственное место, где я видел эту ошибку, если это так, передайте третий аргумент false методу inflate, так как в противном случае он попытается раздувать корень вашего представления, отбрасывая это исключение назад. на тебя.
т.е.
inflater.inflate(R.layout.profile, container, false);
Вы уже исправили некоторые ошибки, как я вижу. Исправьте еще два:
tvHomeTeamName.setLayoutParams(new TableRow.LayoutParams (LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
...
tvHomeTeamScore.setLayoutParams(new TableRow.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
С этими исправлениями это работает на меня.
Сначала вы должны сказать, на какой линии вы получите эту ошибку. Или ставь трассировку стека.
Теперь, вы получили это сообщение об ошибке только потому, что у вас уже есть представление, и вы снова собираетесь добавить другое представление вместо того же представления.
Поэтому сначала удалите добавленное представление с указанным именем, прежде чем добавлять другое представление.
Ex. tl.removeView (блаблабла); затем добавьте представление.
Или же
Если вы хотите загрузить конкретное представление условия цикла, то вы также можете попробовать это.
Создайте еще один XML, как вы хотите выполнить на основе условия цикла. Ex. скажем как child.xml
Затем добавьте этот макет в ваш основной макет на основе условия цикла. Вы также можете получить доступ к данным этого макета в этом цикле.
Посмотрите на эту петлю, которую я сделал.
for (int i = 0; i<=tempEmployerList.size()-1; i++) {
LinearLayout EmpItem = (LinearLayout)LayoutInflater.from (getApplicationContext()).inflate(R.layout.child, null);
// to access with the data use this
((TextView)EmpItem.findViewById(R.id.taxcodeTextView)).setText(TAXCODE);
// Finaly add that loopLayout to your layout to your main layout like this
myLinearLayout.addView(EmpItem);
}
Это поможет вам, как я это проверил.
Если нет, то позвольте мне сообщить.
Или же
Если вы все-таки хотите что-то сделать со своим собственным кодом, то поймите этот пример
Это неприлично поможет вам.
Наслаждаться.:))