it-swarm.com.de

Das angegebene Kind hat bereits ein Elternteil. Sie müssen removeView () zuerst beim übergeordneten Element des Kindes aufrufen (Android).

In meiner App muss ich häufig zwischen zwei Layouts wechseln. Der Fehler tritt in dem unten angegebenen Layout auf.

Wenn mein Layout zum ersten Mal aufgerufen wird, tritt kein Fehler auf und alles ist in Ordnung. Wenn ich dann ein anderes Layout (ein leeres) anrufe und anschließend mein Layout ein zweites Mal anrufe, wird folgende Fehlermeldung angezeigt:

> FATAL EXCEPTION: main
>     Java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

Mein Layout-Code sieht folgendermaßen aus:

    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);
        }
    }
}

Ich weiß, dass diese Frage schon einmal gestellt wurde, aber sie hat in meinem Fall nicht geholfen.

93
blackst0ne

Die Fehlermeldung zeigt, was Sie tun sollen.

// TEXTVIEW
if(tv.getParent() != null) {
    ((ViewGroup)tv.getParent()).removeView(tv); // <- fix
}
layout.addView(tv); //  <==========  ERROR IN THIS LINE DURING 2ND RUN
// EDITTEXT
256
Zielony

Ich bin hier hergekommen, als ich den Fehler mit meinem Recycler durchsuchte, aber die Lösung funktionierte nicht (offensichtlich). Ich habe die Ursache und die Lösung dafür im Falle eines Recyclingberichts geschrieben. Hoffe es hilft jemandem.

Der Fehler wird verursacht, wenn in der onCreateViewHolder() die folgende Methode verwendet wird:

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

Stattdessen sollte es sein 

return new VH(layoutInflater.inflate(R.layout.single_row, null));
36
suku

Übergeben Sie einfach das Attachtoroot-Argument als falsch

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

Ich habe diese Nachricht erhalten, als ich versuche, ein Fragment zu begehen, das Attach to root auf true anstatt auf false setzt, wie so:

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

Nachdem:

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

Es funktionierte.

7
Hudson Pereira

Wenn eine andere Lösung nicht funktioniert:

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

prüfen Sie, was Sie von onCreateView von fragment zurückgeben. Ist es eine Einzelansicht oder eine Ansichtsgruppe? In meinem Fall hatte ich Viewpager auf der Wurzel von xml von fragment und gab Viewpager zurück. Als ich Viewgroup im Layout hinzufügte, habe ich nicht aktualisiert, dass ich Viewgroup jetzt zurückgeben muss, nicht Viewpager (View).

3
blackHawk

In meinem Fall wurde das Problem dadurch verursacht, dass ich die übergeordnete Ansicht mit <merge>-Layout aufblähte. In diesem Fall hat addView() den Absturz verursacht.

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

Das Entfernen vonaddView()half, das Problem zu lösen.

2
soshial

frameLayout.addView (bannerAdView); <----- Wenn Sie in dieser Zeile einen Fehler erhalten, tun Sie dies bitte unten.

if (bannerAdView.getParent() != null)

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

   frameLayout.addView(bannerAdView);     <------ now added view
2
Mayur Dabhi
if(tv!= null){
    ((ViewGroup)tv.getParent()).removeView(tv); // <- fix
}
1
Chandan Bera

Ich habe ein anderes Update gefunden:

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

Hier habe ich nur eine if-Anweisung, um zu überprüfen, ob die Ansicht über ein übergeordnetes Element verfügt. Wenn das Dialogfeld "Neuen Dialog erstellen" nicht erstellt wurde, legen Sie die contentView fest und zeigen das Dialogfeld in meiner Methode "createAlgorithmDialog ()" an.

Dadurch werden auch die positiven und negativen Schaltflächen (OK- und Abbrechen-Schaltflächen) mit onClickListeners eingerichtet.

1
Joshua Orotayo

Der Code unten hat es für mich gelöst:

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

Hinweis: Der Fehler war von meiner Fragment-Klasse. Durch das Überschreiben der onDestroy-Methode konnte ich sie lösen.

1
AK 12

Mein Fehler war, die Ansicht wie folgt zu definieren:

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

Es fehlte:

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

Mit dieser Methode können Sie überprüfen, ob eine Ansicht untergeordnete Elemente hat oder nicht.

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

In meinem Fall passiert es, wenn ich Ansicht von Eltern zu anderer Ansicht hinzufügen möchte

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

sie müssen die übergeordnete Ansicht wie folgt hinzufügen

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

Mein Fall war anders, die Unteransicht hatte bereits eine übergeordnete Ansicht. Ich füge die untergeordnete Ansicht innerhalb einer übergeordneten Ansicht einem anderen übergeordneten Element hinzu. Beispielcode unten

<?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>

Ich habe diese Ansicht aufgeblasen und zu einem anderen LinearLayout hinzugefügt, dann habe ich das LinaarLayout aus dem obigen Layout entfernt und es begann zu arbeiten 

unterhalb des Codes wurde das Problem behoben: 

<?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" />
0
Irfan

prüfen Sie, ob Sie die Ansicht bereits hinzugefügt haben

if (textView.getParent() == null)
    layout.addView(textView);
0
Dan Alboteanu