У указанного ребенка уже есть родитель. Вы должны сначала вызвать removeView() для родительского родителя (Android)

В моем приложении мне приходится часто переключаться между двумя раскладками. Ошибка происходит в макете, размещенном ниже.

Когда мой макет вызывается в первый раз, ошибки не возникает, и все в порядке. Когда я затем вызываю другой макет (пустой) и затем вызываю мой макет во второй раз, это дает мне следующую ошибку:

> FATAL EXCEPTION: main
>     java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child 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

Я пришел сюда при поиске ошибки с моим 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));

Ответ 3

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

View view = inflater.inflate(R.layout.child_layout_to_merge, parent_layout, false);

Ответ 4

Я получил это сообщение, пытаясь зафиксировать фрагмент, используя присоединение к корню в true вместо false, вот так:

return inflater.inflate(R.layout.fragment_profile, container, true)

После выполнения:

return inflater.inflate(R.layout.fragment_profile, container, false)

Это сработало.

Ответ 5

Если другое решение не работает, как:

View view = inflater.inflate(R.layout.child_layout_to_merge, parent_layout, false);

проверить, что вы возвращаете из onCreateView фрагмента, это один вид или группа просмотра? в моем случае у меня был viewpager в корне xml фрагмента, и я возвращал viewpager, когда я добавил viewgroup в макет, я не обновил, что я должен возвращать viewgroup сейчас, а не viewpager (view).

Ответ 6

В моем случае проблема была вызвана тем, что я раздувал родительский вид с макетом <merge>. В этом случае addView() вызвало сбой.

View to_add = inflater.inflate(R.layout.child_layout_to_merge, parent_layout, true);
// parent_layout.addView(to_add); // THIS CAUSED THE CRASH

Удаление addView() помогло решить проблему.

Ответ 7

frameLayout.addView(bannerAdView); <----- если вы получили ошибку в этой строке, сделайте, как показано ниже..

if (bannerAdView.getParent() != null)

  ((ViewGroup) bannerAdView.getParent()).removeView(bannerAdView);

   frameLayout.addView(bannerAdView);     <------ now added view

Ответ 8

Я нашел другое исправление:

if (mView.getParent() == null) {
                    myDialog = new Dialog(MainActivity.this);
                    myDialog.setContentView(mView);
                    createAlgorithmDialog();
                } else {
                    createAlgorithmDialog();
                }

Здесь у меня есть только оператор if, проверяющий, имел ли представление родительский элемент и не создал ли он новый диалог, установите ContentView и покажите диалог в моем методе createAlgorithmDialog().

Это также устанавливает положительные и отрицательные кнопки (кнопки ok и cancel) с помощью onClickListeners.

Ответ 9

Код ниже решил это для меня:

@Override
public void onDestroyView() {
    if (getView() != null) {
        ViewGroup parent = (ViewGroup) getView().getParent();
        parent.removeAllViews();
    }
    super.onDestroyView();
}

Примечание: ошибка была из моего класса фрагмента, и, переопределив метод onDestroy следующим образом, я мог бы ее исправить.

Ответ 10

if(tv!= null){
    ((ViewGroup)tv.getParent()).removeView(tv); // <- fix
}

Ответ 11

Моя ошибка была определить вид следующим образом:

view = inflater.inflate(R.layout.qr_fragment, container);

Не хватало

view = inflater.inflate(R.layout.qr_fragment, container, false);

Ответ 12

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

public static boolean hasChildren(ViewGroup viewGroup) {
    return viewGroup.getChildCount() > 0;
 }

Ответ 13

проверьте, добавили ли вы уже вид

if (textView.getParent() == null)
    layout.addView(textView);

Ответ 14

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/lineGap"
>
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textColor="@color/black1"
    android:layout_gravity="center"
    android:gravity="center"
    />

</LinearLayout>

И я надувал этот вид и добавлял к другому LinearLayout, затем я удалил LinaarLayout из вышеприведенного макета, и он начал работать

код ниже исправил проблему:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:gravity="center"
   android:textColor="@color/black1" />

Ответ 15

В моем случае это происходит, когда я хочу добавить представление по родителю в другое представление

View root = inflater.inflate(R.layout.single, null);
LinearLayout lyt = root.findViewById(R.id.lytRoot);
lytAll.addView(lyt);

Вы должны добавить родительский вид, как это

View root = inflater.inflate(R.layout.single, null);
LinearLayout lyt = root.findViewById(R.id.lytRoot);
lytAll.addView(root);