web-dev-qa-db-fra.com

L'enfant spécifié a déjà un parent. Vous devez d'abord appeler removeView () sur le parent de l'enfant.

Je crée ce post parce que je suis nouveau dans ce domaine et que j'ai besoin d'un peu d'aide. Je fais un petit exercice sur une application qui vous a mis votre nom, et elle renvoie "bonjour (le nom que vous avez mis)". Mais après avoir appuyé sur le bouton, le message d'erreur suivant s'affiche: "L'enfant spécifié a déjà un parent. Vous devez d'abord appeler removeView () sur le parent de l'enfant"

MainActivity.Java

package com.example.holaamigos;

import Android.os.Bundle;
import Android.app.Activity;
import Android.content.Intent;
import Android.view.*;
import Android.view.View.OnClickListener;
import Android.widget.Button;
import Android.widget.EditText;

public class MainActivity extends Activity {
    public final static String EXTRA_SALUDO = "com.example.holaamigos.SALUDO";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final EditText txtNombre = (EditText)findViewById(R.id.TxtNombre);
        final Button btnHola = (Button)findViewById(R.id.BtnHola);

            btnHola.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(MainActivity.this, ActivitySaludo.class);
                    String saludo = txtNombre.getText().toString();
                    intent.putExtra(EXTRA_SALUDO, saludo);
                    startActivity(intent);
        }

    });

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

ActivitySaludo.Java

package com.example.holaamigos;


import Android.app.Activity;
import Android.content.Intent;
import Android.os.Bundle;
import Android.widget.TextView;

public class ActivitySaludo extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_saludo);

        Intent intent = getIntent();
        String saludo = intent.getStringExtra(MainActivity.EXTRA_SALUDO);

        //TextView txt = new TextView(this);
        //txt.setText(20);
        //txt.setText(saludo);

        TextView txtCambiado = (TextView) findViewById(R.id.TxtSaludo);
        txtCambiado.setText(saludo);
        setContentView(txtCambiado);
    }

}

activity_saludo.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="vertical" >

    <TextView 
        Android:id="@+id/TxtSaludo"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="" />


</LinearLayout>

activity_main.xml

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:id="@+id/LinearLayout1"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="vertical" >

    <TextView
        Android:id="@+id/LblNombre"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="@string/nombre" />

    <EditText
        Android:id="@+id/TxtNombre"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:inputType="text" />

    <Button 
        Android:id="@+id/BtnHola"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="@string/hola_apy"
        Android:onClick="enviarSaludo"/>

</LinearLayout>

LogCat

10-10 16:12:18.470: D/AndroidRuntime(810): Shutting down VM
10-10 16:12:18.470: W/dalvikvm(810): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
10-10 16:12:18.586: E/AndroidRuntime(810): FATAL EXCEPTION: main
10-10 16:12:18.586: E/AndroidRuntime(810): Java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.holaamigos/com.example.holaamigos.ActivitySaludo}: Java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
10-10 16:12:18.586: E/AndroidRuntime(810):  at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2180)
10-10 16:12:18.586: E/AndroidRuntime(810):  at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2230)
10-10 16:12:18.586: E/AndroidRuntime(810):  at Android.app.ActivityThread.access$600(ActivityThread.Java:141)
10-10 16:12:18.586: E/AndroidRuntime(810):  at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1234)
10-10 16:12:18.586: E/AndroidRuntime(810):  at Android.os.Handler.dispatchMessage(Handler.Java:99)
10-10 16:12:18.586: E/AndroidRuntime(810):  at Android.os.Looper.loop(Looper.Java:137)
10-10 16:12:18.586: E/AndroidRuntime(810):  at Android.app.ActivityThread.main(ActivityThread.Java:5041)
10-10 16:12:18.586: E/AndroidRuntime(810):  at Java.lang.reflect.Method.invokeNative(Native Method)
10-10 16:12:18.586: E/AndroidRuntime(810):  at Java.lang.reflect.Method.invoke(Method.Java:511)
10-10 16:12:18.586: E/AndroidRuntime(810):  at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:793)
10-10 16:12:18.586: E/AndroidRuntime(810):  at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:560)
10-10 16:12:18.586: E/AndroidRuntime(810):  at dalvik.system.NativeStart.main(Native Method)
10-10 16:12:18.586: E/AndroidRuntime(810): Caused by: Java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
10-10 16:12:18.586: E/AndroidRuntime(810):  at Android.view.ViewGroup.addViewInner(ViewGroup.Java:3339)
10-10 16:12:18.586: E/AndroidRuntime(810):  at Android.view.ViewGroup.addView(ViewGroup.Java:3210)
10-10 16:12:18.586: E/AndroidRuntime(810):  at Android.view.ViewGroup.addView(ViewGroup.Java:3186)
10-10 16:12:18.586: E/AndroidRuntime(810):  at com.Android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.Java:289)
10-10 16:12:18.586: E/AndroidRuntime(810):  at com.Android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.Java:279)
10-10 16:12:18.586: E/AndroidRuntime(810):  at Android.app.Activity.setContentView(Activity.Java:1901)
10-10 16:12:18.586: E/AndroidRuntime(810):  at com.example.holaamigos.ActivitySaludo.onCreate(ActivitySaludo.Java:25)
10-10 16:12:18.586: E/AndroidRuntime(810):  at Android.app.Activity.performCreate(Activity.Java:5104)
10-10 16:12:18.586: E/AndroidRuntime(810):  at Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1080)
10-10 16:12:18.586: E/AndroidRuntime(810):  at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2144)
10-10 16:12:18.586: E/AndroidRuntime(810):  ... 11 more
10-10 16:12:18.856: D/dalvikvm(810): GC_CONCURRENT freed 134K, 10% free 2630K/2908K, paused 73ms+83ms, total 237ms
49
Javier Coronel

Dans onCreate with activity ou onCreateView avec fragment

 if (view != null) {
    ViewGroup parent = (ViewGroup) view.getParent();
    if (parent != null) {
        parent.removeView(view);
    }
}
try {
    view = inflater.inflate(R.layout.fragment_main, container, false);
} catch (InflateException e) {

}
24
Cabezas

dans ActivitySaludo, cette ligne,

    setContentView(txtCambiado);

vous ne devez définir l'affichage du contenu de l'activité qu'une seule fois.

19
Jeffrey Blattman

Vous n'avez pas besoin de cette ligne: setContentView(txtCambiado);

10
Danilo Silva

Dans mon cas, je renvoyais accidentellement une vue enfant de Layout.onCreateView() comme indiqué ci-dessous:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_reject, container, false);

    Button button = view.findViewById(R.id.some_button);

    return button; // <-- Problem is this
}

La solution consistait à renvoyer la vue parent au lieu de la vue enfant.

3
Sam

Dans mon cas, le problème était que j'essayais d'ajouter plusieurs fois la même vue à une présentation linéaire. 

View childView = LayoutInflater.from(context).inflate(R.layout.lay_progressheader, parentLayout,false);

 for (int i = 1; i <= totalCount; i++) {

     parentLayout.addView(childView);

 }

il suffit d'initialiser la vue à chaque fois pour résoudre le problème

 for (int i = 1; i <= totalCount; i++) {

     View childView = LayoutInflater.from(context).inflate(R.layout.lay_progressheader, parentLayout,false);

      parentLayout.addView(childView);

 }
1
Manohar Reddy

si vous ajoutez la même vue à plusieurs reprises dans une boucle for. Si c'est le cas, essayez de créer l'objet View de la présentation dans la boucle for. et ajouter la vue dans la boucle for 

Pour éviter de tels problèmes 

1
Peter

Essayez de cette façon, espérons que cela vous aidera à résoudre votre problème.

TextView textView = new TextView(this);
textView.setText("CustomTextView");
addContentView(textView,new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
1
Haresh Chhelana

Vous devez juste initialiser votre vue dans la méthode onCreate () puis à nouveau dans onCreateDialog () avant setView () et cela devrait fonctionner!

0
Spinner

frameLayout.addView (yourView); <----- si vous obtenez une erreur sur cette ligne, supprimez d'abord la vue de son parent

if (yourView.getParent ()! = null)

((ViewGroup) yourView.getParent ()). RemoveView (yourView); FrameLayout.addView (yourView); (Ajouter la vue à la mise en page)

0
Krishna sheladiya

J'ai rencontré cette erreur alors qu'il y avait une vue invisible dans une présentation XML d'activité. A cette époque, il n'était pas utilisé dans mon cas, je l'ai donc retiré et le crash ne se voit plus.