8
votes

SupprimerView ne fonctionne pas

J'ai une erreur inhabituelle. J'ai cela dans un groupe de vue personnalisé. La méthode reçoit une vue et l'ajoutez à la mise en page mais je continue à obtenir la même erreur: xxx pré>

L'erreur est: p>

java.lang.illegalstateException: l'enfant spécifié a déjà un parent. Vous devez appeler SupprimerView () sur le parent de l'enfant d'abord. P>

Utilisation de points d'arrêt autour de cela montre que "View" même après avoir appelé SupprimerView sur le parent Gardez une référence à son parent. P>

Certains Les gens ont proposé d'utiliser un alinéa pour attendre quelques secondes avant de l'ajouter à la vue. Je n'ai pas essayé cela parce que cela semble plus un hack qu'une solution. De toute façon, j'espère que quelqu'un peut aider P>

Merci! P>

PS: non pas que cela devrait importer mais Le parent de cette vue J'ajoute est une mise en page de grille personnalisée que j'ai faite et son parent est un espace de visual. p>

EDIT: P>

J'ai fait un peu plus de points d'arrêt et de débogage et de la recherche De cela, la grille retirez efficacement la vue de sa liste enfant (débogage) mais la vue enfant conserve une référence à cette même grille dans sa variable méritée (débogage). Comment cela est-ce possible P>

EDIT: P>

dans Activité: P>

public void addCustomView(View view){
    if((ViewGroup)view.getParent() != null){
        ((ViewGroup)view.getParent()).removeView(view);
    }

    addView(view);
}


8 commentaires

Êtes-vous sûr que SupprimerView est appelé? Dans quelle classe s'agit-il de cela? Pourquoi dans le premier cas que vous devez utiliser la méthode getparent () et dans le second cas, vous appelez simplement addview () ?


parce que les grilles sont différentes. Je déplace les vues d'enfants entre deux grilles et la méthode que j'appelle à l'intérieur de la grille pour déplacer une vue d'une grille à l'autre et oui, supprimer la vue est appelée


Comment Voir déclarée, quel est le code?


Je ne sais pas si cela vous aidera, mais avez-vous essayé d'appeler vue.Invalidate () avant d'ajouter? Mais vous envoyez une vue nouvellement créée (à partir du code que vous avez posté) afin qu'il n'aurait pas de parent.


J'appelle addCustomView sur plusieurs spots .. Sur l'événement de la vue Childs, sur l'événement de long clic, etc.


essayé invalider () sur la vue enfant, ne le résout pas, l'erreur continue d'apparaître


Quel est le type de parent précédent de votre bouton? Est-ce une instance de ADPATERView?


NOP, le parent est une mise en page de grille personnalisée que j'ai fabriquée à l'extension du groupe de vue, mais il se comporte actuellement comme une mise en page linéaire. Il ne peut donc pas être la mise en œuvre de la mise en page de la grille.


3 Réponses :


12
votes

J'ai eu ce même problème lorsque vous essayez de créer une bannière personnalisée. Je crois que c'est à cause de l'animation pendant la mise en page, c'est pourquoi un retard pourrait fonctionner. Dans mon cas, j'ai fait une classe de groupe de vie personnalisée pour éliminer le délai d'animation: XXX

Une fois que je l'ai fait, tout a fonctionné comme prévu.

espère qu'il aide!


3 commentaires

Merci! Je n'avais pas pensé que ^^


Une autre façon d'éliminer l'animation sans créer de sous-classe est de définir Transition de la mise en page pour parent à NULL Quelque chose comme ça: parentview.setlayouttransition (null); parentview.removeview (vue);


@Chupik Il est important de noter que setlayouttransition (...) a été ajouté à l'API 11



0
votes

J'ai eu le même problème, et la réponse de Iree m'a vraiment aidé. La cause était l'animation de la transition de la mise en page, mais si je lui ai défini sa valeur null forte> je vais perdre mon animation de transition. Donc, ce que j'ai fait est d'ajouter un auditeur de transition de mise en page, de cette façon que vous pouvez auditeur lorsque la transition est terminée, puis ajoutez la vue à son nouveau parent.

Utilisation Java P>

val layoutTransition = (view.parent as ViewGroup).layoutTransition
layoutTransition.addTransitionListener(object : LayoutTransition.TransitionListener {

      override fun startTransition(transition: LayoutTransition?,container: ViewGroup?,view: View?,transitionType: Int) {

      }

      override fun endTransition(transition: LayoutTransition?,container: ViewGroup?,view: View?,transitionType: Int) {
         // now you can add the same view to another parent
         addView(view)
      }
})


0 commentaires

0
votes

Si vous devriez avoir à voir avec Glusgroups code> qui ont LayoutTransition code> ou non, vous pouvez faire quelque chose comme ceci:

sourceLayout.removeView(textView)
doOnParentRemoved(sourceLayout) {
   // do your stuff when view has no parent
   // add more logic to check is your view who called it in case of multiple views
}


0 commentaires