141 votes

Appelez d'abord removeView() sur le parent de l'enfant.

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 défilante défile. Cependant, après une certaine quantité de défilement, je devais désactiver le défilement sur la vue de défilement et déplacer le "scroll focus" sur une vue web à l'intérieur de la mise en page enfant. De cette façon, la vue de défilement reste en place et tous les événements de défilement sont dirigés vers la vue Web qu'elle contient.

Donc, pour une solution, lorsque le seuil de défilement est atteint, je supprime la mise en page enfant du scrollview et la place dans le parent du scrollview (et rend le scrollview 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

After : 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)

Vous savez ce qui se passe ? Je suis clairement en train d'appeler removeView sur le parent.

291voto

kasgoku Points 1995

Solution :

((ViewGroup)scrollChildLayout.getParent()).removeView(scrollChildLayout);
//scrollView.removeView(scrollChildLayout);

Utilisez l'élément enfant pour obtenir une référence au parent. Transformez le parent en ViewGroup afin d'avoir accès à la méthode removeView et utilisez-la.

Merci à @Dongshengcn pour la solution

21voto

dongshengcn Points 2259

Essayez d'abord de retirer le scrollChildLayout de sa vue parent ?

scrollview.removeView(scrollChildLayout)

Ou supprimer tous les enfants de la vue parent, et les ajouter à nouveau.

scrollview.removeAllViews()

20voto

Cabezas Points 167

Dans onCreate avec l'activité ou dans onCreateView avec le 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) {

}

15voto

Martin Points 3543

Ok, appelez-moi paranoïaque mais je suggère :

  final android.view.ViewParent parent = view.getParent ();

  if (parent instanceof android.view.ViewManager)
  {
     final android.view.ViewManager viewManager = (android.view.ViewManager) parent;

     viewManager.removeView (view);
  } // if

coulage sans instanceof ça semble juste mal. Et (merci à IntelliJ IDEA de me l'avoir dit) removeView fait partie de la ViewManager l'interface. Et il ne faut pas faire un moulage vers une classe concrète lorsqu'une interface parfaitement adaptée est disponible.

3voto

Romain Guy Points 57114

Tout ce que vous avez à faire est de poster() un Runnable qui fait le addView().

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X