Tout d'abord un peu de contexte:
J'ai une mise en page dans un scrollview. Au début, lorsque l'utilisateur fait défiler l'écran, la vue de défilement défile. Cependant, après un certain nombre de défilement, je devais désactiver le défilement sur la vue de défilement et déplacer le "focus de défilement" sur une vue Web à l'intérieur de la mise en page enfant. De cette façon, la vue de défilement reste bloquée et tous les événements de défilement vont à la vue Web à l'intérieur.
Donc, pour une solution, lorsque le seuil de défilement est atteint, je supprime la mise en page enfant de la vue de défilement et la place dans le parent de la vue de défilement (et rend la vue de défilement invisible).
// Remove the child view from the scroll view
scrollView.removeView(scrollChildLayout);
// Get scroll view out of the way
scrollView.setVisibility(View.GONE);
// Put the child view into scrollview's parent view
parentLayout.addView(scrollChildLayout);
Idée générale: (-> signifie contient)
Avant: parentlayout -> scrollview -> scrollChildLayout
Après: parentLayout -> scrollChildLayout
Le code ci-dessus me donne cette exception:
java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
at android.view.ViewGroup.addViewInner(ViewGroup.java:1976)
at android.view.ViewGroup.addView(ViewGroup.java:1871)
at android.view.ViewGroup.addView(ViewGroup.java:1828)
at android.view.ViewGroup.addView(ViewGroup.java:1808)
Savez-vous ce qui se passe? J'appelle clairement removeView sur le parent.
la source
scrollView.removeView(scrollChildLayout)
essayer de supprimer l'enfant de scrollView, de ne pas supprimer le scrollView lui-même de son ViewGroup parentif (mAdView.getParent()!=null) ((ViewGroup) mAdView.getParent()).removeView(mAdView);
Essayez d'abord de supprimer scrollChildLayout de sa vue parente?
Ou supprimez tous les enfants de la vue parent et ajoutez-les à nouveau.
la source
Dans onCreate avec activité ou dans onCreateView avec fragment.
la source
Ok, appelez-moi paranoïaque mais je suggère:
casting sans
instanceof
semble juste faux. Et (merci IntelliJ IDEA de me l'avoir dit)removeView
fait partie de l'ViewManager
interface. Et il ne faut pas jeter dans une classe concrète lorsqu'une interface parfaitement adaptée est disponible.la source
Tout ce que vous avez à faire est de poster () un Runnable qui fait le addView ().
la source
J'appelais parentView.removeView (childView) et childView était toujours affiché. J'ai finalement réalisé qu'une méthode était en quelque sorte déclenchée deux fois et j'ai ajouté deux fois le childView au parentView.
Donc, utilisez parentView.getChildCount () pour déterminer le nombre d'enfants que le parent a avant d'ajouter une vue et après. Si l'enfant est ajouté trop de fois, alors l'enfant le plus en haut est en cours de suppression et la copie childView reste - ce qui ressemble à removeView fonctionne même quand c'est le cas.
De plus, vous ne devez pas utiliser View.GONE pour supprimer une vue. S'il est vraiment supprimé, vous n'aurez pas besoin de le cacher, sinon il est toujours là et vous le cachez simplement :(
la source
Dans mon cas, j'ai BaseFragment et tous les autres fragments en héritent.
Donc ma solytion a été d'ajouter ces lignes dans la
OnDestroyView()
méthodela source
Solution Kotlin
Kotlin simplifie le casting parent avec
as?
, en renvoyant null si le côté gauche est nul ou si le cast échoue.Solution d'extension Kotlin
Si vous souhaitez simplifier encore plus cela, vous pouvez ajouter cette extension.
Il ne fera rien en toute sécurité si cette vue est nulle, la vue parente est nulle ou la vue parente n'est pas un groupe de vues
la source
Vous pouvez également le faire en vérifiant si la méthode indexOfView de View si la méthode indexOfView renvoie -1, nous pouvons utiliser.
DetachViewFromParent (v) de ViewGroup; suivi de removeDetachedView de ViewGroup (v, true / false);
la source
Ce que je faisais de mal, j'ai eu cette erreur, c'est que je n'instanciais pas la mise en page dynamique et n'y ajoutais pas des enfants, j'ai donc cette erreur
la source
Voici ma solution.
Disons que vous en avez deux
TextViews
et mettez-les sur unLinearLayout
(nomméll
). Vous allez mettre çaLinerLayout
sur un autreLinerLayout
.Lorsque vous souhaitez créer cette structure, vous devez donner le parent en héritage.
Si vous voulez l'utiliser dans une
onCreate
méthodethis
suffira.Sinon voici la solition:
la source