The specified child already has a parent. You must call removeView() on the child's parent first (Android)
У указанного дочернего элемента уже есть родительский элемент. Вы должны сначала вызвать removeView() у родительского элемента дочернего элемента (Android)
Мне приходится часто переключаться между двумя макетами. Ошибка возникает в макете, размещенном ниже.
Когда мой макет вызывается в первый раз, никакой ошибки не возникает, и все в порядке. Когда я затем вызываю другой макет (пустой), а затем вызываю свой макет во второй раз, он выдает следующую ошибку:
> FATAL EXCEPTION: main > java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
Мой макет-код выглядит следующим образом:
tv = newTextView(getApplicationContext()); // are initialized somewhere else et = newEditText(getApplicationContext()); // in the code
// MY LAYOUT: setContentView(R.layout.activity_console); // LINEAR LAYOUT LinearLayout layout=newLinearLayout(getApplicationContext()); layout.setOrientation(LinearLayout.VERTICAL); setContentView(layout);
// TEXTVIEW layout.addView(tv); // <========== ERROR IN THIS LINE DURING 2ND RUN // EDITTEXT et.setHint("Enter Command"); layout.addView(et); } } }
Я знаю, что этот вопрос задавался раньше, но в моем случае это не помогло.
Переведено автоматически
Ответ 1
В сообщении об ошибке указано, что вы должны сделать.
// TEXTVIEW if(tv.getParent() != null) { ((ViewGroup)tv.getParent()).removeView(tv); // <- fix } layout.addView(tv); // <========== ERROR IN THIS LINE DURING 2ND RUN // EDITTEXT
Я пришел сюда, чтобы найти ошибку в моем recyclerview, но решение не сработало (очевидно). Я написал причину и решение для нее в случае recyclerview. Надеюсь, это кому-то поможет.
Ошибка возникает, если в onCreateViewHolder() используется следующий метод:
Вы должны сначала удалить дочерний элемент из его родительского элемента.
Если ваш проект находится на Kotlin, ваше решение будет выглядеть немного иначе, чем Java. Kotlin упрощает приведение с помощью as?, возвращая null, если левая сторона равна null или приведение завершается неудачно.
Если вам нужно сделать это более одного раза, добавьте это расширение, чтобы сделать ваш код более читаемым.
childView.removeSelf()
fun View?.removeSelf() { this ?: return valparentView= parent as? ViewGroup ?: return parentView.removeView(this) }
Это безопасно ничего не сделает, если это представление равно нулю, родительское представление равно нулю или родительское представление не является ViewGroup