4 votes

Android Fragments getView renvoyant le parent de la vue ?

J'ai donc rencontré un comportement étrange en ce qui concerne la méthode getVIew() de la classe de fragment. D'après la documentation, je m'attends à obtenir la vue créée dans la méthode onCreateView, comme indiqué ici [http://developer.Android.com/reference/Android/app/Fragment.html#getView()](http://developer.android.com/reference/android/app/Fragment.html#getView())

"Obtenez la vue racine pour la mise en page du fragment (celle renvoyée par onCreateView(LayoutInflater, ViewGroup, Bundle)), si elle est fournie".

Maintenant, j'ai une vue qui a un nombre assez important d'enfants, donc je voulais essayer d'économiser lorsque j'essaie de "findViewById" en implémentant une classe ViewHolder similaire à la manière commune dont cela est fait dans les adaptateurs ListView, que j'ai défini comme étant le tag de la vue retournée par le onCreateView.

Le comportement étrange se produit plus tard lorsque j'appelle la méthode getView. Il semble que le fragment renvoie le parent de la vue que je crée plutôt que la vue que je crée, ce qui entraîne le renvoi d'une balise nulle.

J'ai écrit un petit bout de code pour imprimer une vue (en imbriquant les enfants si la vue est en fait un viewGroup) et voici ce que j'obtiens.

 android.widget.ScrollView  android.widget.ScrollView@4242dec0
 /android.widget.ScrollView 

et quand je l'imprime plus tard en utilisant la méthode getView() j'obtiens

 android.support.v4.app.NoSaveStateFrameLayout
     android.widget.ScrollView  android.widget.ScrollView@4242dec0
     /android.widget.ScrollView 
 /android.support.v4.app.NoSaveStateFrameLayout 

Comme vous pouvez le voir, le ScrollView est la vue que je crée réellement dans la méthode onCreateView. Alors pourquoi getView renvoie-t-il le parent au lieu de la vue ?

1voto

pschwamb Points 291

La bibliothèque de support insère une vue supplémentaire dans la hiérarchie des vues. D'après un commentaire dans NoSaveStateFrameLayout.java : "Les versions pré-Honeycomb de la plate-forme n'ont pas View.setSaveFromParentEnabled(), donc à la place nous insérons ceci entre la vue et son parent."

Vous devrez donc soit vérifier cela avec quelque chose comme :

View myView = (NoSaveStateFrameLayout)getView();
if (myView != null) {
  myView = myView.getChildAt(0);
}

Ou gardez la trace de la vue retournée par onCreateView dans une variable d'instance.

0voto

aid noodle Points 839

Serait-il possible que vous créiez l'adaptateur avant onCreateView complète ? J'ai eu un problème avec une fonction qui appelait getView() et manipulait les éléments de mise en page avant le retour de onCreateView, ce qui entraînait l'utilisation d'une vue incorrecte. J'ai fini par envoyer la vue gonflée de onCreateView à la fonction, et tout s'est bien passé.

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