2015-01-21 9 views
66

In meiner App muss ich häufig zwischen zwei Layouts wechseln. Der Fehler tritt im unten angegebenen Layout auf.Das angegebene Kind hat bereits einen Elternteil. Sie müssen zuerst removeView() auf dem übergeordneten Element des Kindes aufrufen (Android)

Wenn mein Layout das erste Mal aufgerufen wird, tritt kein Fehler auf und alles ist in Ordnung. Wenn ich rufe dann ein anderes Layout (eine leere) und danach ein zweites Mal mein Layout nennen, gibt es mir die folgende Fehlermeldung:

> 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 wie folgt aussieht:

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 in meinem Fall hat es nicht geholfen.

Antwort

197

Die Fehlermeldung sagt, was Sie tun sollten.

23

Ich kam hier auf der Suche nach dem Fehler mit meinem Recyclerview, aber die Lösung hat nicht funktioniert (offensichtlich). Ich habe die Ursache und die Lösung für den Fall der Recyclerview geschrieben. Hoffe es hilft jemandem.

Der Fehler wird verursacht, wenn in der onCreateViewHolder() das folgende Verfahren folgt: i

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

hier:

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

Stattdessen sollte es

return new VH(layoutInflater.inflate(R.layout.single_row, null)); 
+3

Manchmal zufällige Antworten, die auf die gestellten Fragen helfen nicht genau die Antworten sind jemand anderes. Das hat für mich funktioniert. Vielen Dank! –

+0

Nice !, und deshalb sollten die Leute meistens "Null" als 2d Parameter in Inflaters übergeben. Vielen Dank. – superUser

+1

Null an den Parameter übergeben, der für den Elternteil verantwortlich ist, ist keine schlechte Idee, aber Sie müssen wissen, dass in diesem Fall die Kindansicht (die, die Sie aufblasen) in einigen Fällen nicht in der Lage ist, es selbst korrekt zu messen, weil es tut nichts über die Eltern wissen. In einigen Fällen wird es funktionieren, in einigen Fällen nicht. – Sniper

0

ich ein weiteres Update gefunden werden Habe einfach eine if-Anweisung, um zu überprüfen, ob die Ansicht ein Elternteil hat und ob das neue dialo nicht erstellt wurde g, setze die contentView und zeige den Dialog in meiner "createAlgorithmDialog()" Methode.

Damit werden auch die positiven und negativen Tasten (ok und Abbrechen-Tasten) mit onClickListeners eingestellt.

1

In meinem Fall wurde das Problem durch die Tatsache verursacht, dass ich Eltern View mit <merge> Layout aufgeblasen. In diesem Fall verursachte addView() den Absturz.

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

Entfernen von addView() geholfen, das Problem zu lösen.

7

einfach die attachtoroot Argument übergeben als falsch

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