ошибка "указанный ребенок уже имеет родителя" - PullRequest
0 голосов
/ 27 января 2012

У меня есть страница, на которой будут отображаться запланированные на недели игры для выбранного вида спорта.Выбранный вид спорта и недели сохраняются в файле 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 ]

4 голосов
/ 27 января 2012

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

Инфлятор разметки - единственное место, где я видел эту ошибку, если это так, передайте третий аргумент false методу inflate, так как в противном случае он будет пытаться раздувать корень вашего представления, таким образом выбрасывая это исключение обратно на вас.

т.е.

inflater.inflate(R.layout.profile, container, false);
0 голосов
/ 30 января 2012

Вы уже исправили некоторые ошибки, как я вижу.Исправьте еще два:

    tvHomeTeamName.setLayoutParams(new TableRow.LayoutParams (LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));

...

    tvHomeTeamScore.setLayoutParams(new TableRow.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));

С этими исправлениями это работает на меня.

0 голосов
/ 27 января 2012

Сначала вы должны указать, по какой строке вы получаете эту ошибку.Или поместите stack-trace.

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

Итак, перед добавлением другого вида сначала удалите добавленный вид с указанным именем.

Пример.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); 
}

Это очень поможет вам, поскольку я его проверил.

Если нет, то позвольте мне сообщить.

Или

Если все-таки вы хотите что-то сделать со своим собственным кодом, то поймите этот пример

Это вам наверняка поможет.

Наслаждайтесь.:))

...