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 (Android).

Dans mon application, je dois passer fréquemment de deux mises en page. L'erreur se produit dans la mise en page affichée ci-dessous.

Lorsque ma mise en page est appelée pour la première fois, aucune erreur ne se produit et tout va bien. Lorsque j'appelle ensuite une autre mise en page (une vierge) et que j'appelle ensuite ma mise en page une seconde fois, l'erreur suivante apparaît:

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

Mon code de présentation ressemble à ceci:

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

Je sais que cette question a déjà été posée, mais cela ne m'a pas aidé.

93
blackst0ne

Le message d'erreur dit ce que vous devez faire.

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

Je suis venu ici pour chercher l’erreur avec mon rapport de recyclage, mais la solution n’a pas fonctionné (évidemment). J'ai écrit la cause et la solution en cas de recyclage. J'espère que ça aide quelqu'un.

L'erreur est provoquée si dans la onCreateViewHolder() la méthode suivante est suivie:

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

Au lieu de cela, il devrait être 

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

passez simplement l'argument attachtoroot comme faux

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

J'ai eu ce message en essayant de commettre un fragment en utilisant attach to root to true au lieu de false, comme ceci:

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

Après avoir fait:

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

Ça a marché.

7
Hudson Pereira

Si une autre solution ne fonctionne pas comme:

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

vérifiez ce que vous retournez de onCreateView de fragment s'il s'agit d'une vue unique ou d'un groupe de vues? dans mon cas, j'avais viewpager sur la racine de xml de fragment et je retournais viewpager, quand j'ai ajouté viewgroup dans la mise en page, je n'ai pas mis à jour le fait que je dois retourner viewgroup maintenant, pas viewpager (view).

3
blackHawk

Dans mon cas, le problème était dû au fait que je gonflais la vue parent avec la disposition <merge>. Dans ce cas, addView() a provoqué le crash.

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

SupprimeraddView()a aidé à résoudre le problème.

2
soshial

frameLayout.addView (bannerAdView); <----- Si vous obtenez une erreur sur cette ligne, faites comme ci-dessous.

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

J'ai trouvé un autre correctif:

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

Ici, j'ai juste une déclaration if pour vérifier si la vue avait un parent et si elle ne créait pas la nouvelle boîte de dialogue, définissait contentView et montrait la boîte de dialogue dans ma méthode "createAlgorithmDialog ()".

Ceci configure également les boutons positifs et négatifs (boutons ok et cancel) avec onClickListeners.

1
Joshua Orotayo

Le code ci-dessous l'a résolu pour moi:

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

Remarque: L'erreur venait de ma classe fragment et en redéfinissant la méthode onDestroy comme ceci, je pouvais le résoudre.

1
AK 12

Mon erreur a été de définir la vue comme ceci:

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

Il manquait:

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

Vous pouvez utiliser cette méthode pour vérifier si une vue a des enfants ou non.

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

Dans mon cas, cela arrive quand je veux ajouter une vue par parent à une autre vue

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

vous devez ajouter une vue parent comme celle-ci

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

Mon cas était différent. La vue enfant avait déjà une vue parent. J'ajoute la vue enfant dans la vue parent à un parent différent. exemple de code ci-dessous

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

Et je gonflais cette vue et ajoutais un autre LinearLayout, puis j’ai retiré le LinaarLayout de la présentation ci-dessus et cela a commencé 

le code ci-dessous corrige le problème: 

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

vérifier si vous avez déjà ajouté la vue

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