Android

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 = new TextView(getApplicationContext()); // are initialized somewhere else
et = new EditText(getApplicationContext()); // in the code


private void ConsoleWindow(){
runOnUiThread(new Runnable(){

@Override
public void run(){

// MY LAYOUT:
setContentView(R.layout.activity_console);
// LINEAR LAYOUT
LinearLayout layout=new LinearLayout(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
Ответ 2

просто передайте аргумент


attachtoroot = false


View view = inflater.inflate(R.layout.child_layout_to_merge, parent_layout, false);
Ответ 3

Я пришел сюда, чтобы найти ошибку в моем recyclerview, но решение не сработало (очевидно). Я написал причину и решение для нее в случае recyclerview. Надеюсь, это кому-то поможет.

Ошибка возникает, если в onCreateViewHolder() используется следующий метод:

layoutInflater = LayoutInflater.from(context);
return new VH(layoutInflater.inflate(R.layout.single_row, parent));

Вместо этого должно быть

return new VH(layoutInflater.inflate(R.layout.single_row, null));
Ответ 4

Вы должны сначала удалить дочерний элемент из его родительского элемента.

Если ваш проект находится на Kotlin, ваше решение будет выглядеть немного иначе, чем Java. Kotlin упрощает приведение с помощью as?, возвращая null, если левая сторона равна null или приведение завершается неудачно.

(childView.parent as? ViewGroup)?.removeView(childView)
newParent.addView(childView)

Решение для расширения Kotlin

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

childView.removeSelf()

fun View?.removeSelf() {
this ?: return
val parentView = parent as? ViewGroup ?: return
parentView.removeView(this)
}

Это безопасно ничего не сделает, если это представление равно нулю, родительское представление равно нулю или родительское представление не является ViewGroup

2023-06-10 02:34 java android android-edittext textview