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é.
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
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));
passez simplement l'argument attachtoroot comme faux
View view = inflater.inflate(R.layout.child_layout_to_merge, parent_layout, false);
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é.
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).
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.
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
if(tv!= null){
((ViewGroup)tv.getParent()).removeView(tv); // <- fix
}
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.
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.
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);
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;
}
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);
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" />
vérifier si vous avez déjà ajouté la vue
if (textView.getParent() == null)
layout.addView(textView);