J'écris une application dans le seul but d'essayer de comprendre comment fonctionne la hiérarchie des vues dans Android. J'ai des problèmes vraiment sérieux en ce moment. Je vais essayer d'être concis dans mes explications ici.Essayer de comprendre la hiérarchie des vues
Configuration:
Actuellement, j'ai trois vues. 2 sont ViewGroups
et 1 est juste un View
. Disons qu'ils sont dans cet ordre:
TestA extends ViewGroup
TestB extends ViewGroup
TestC extends View
TestA->TestB->TestC
Where TestC is in TestB and TestB is in TestA.
Dans mon Activity
j'afficher simplement les vues comme ceci:
TestA myView = new TestA(context);
myView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT));
setContentView(myView);
Problèmes:
La méthode
onDraw(Canvas canvas)
de TESTA jamais appelé. J'ai vu quelques solutions à cela en disant que ma vue n'a pas de dimensions (height/width = 0), cependant, ce n'est pas le cas. Lorsque je remplaceonLayout()
, j'obtiens les dimensions de ma mise en page et elles sont correctes. De plus, getHeight()/Width() est exactement ce qu'il devrait être. Je peux également remplacerdispatchDraw()
et obtenir mes vues de base pour se dessiner.Je souhaite animer un objet dans
TestB
. Traditionnellement, je remplacerait la méthodeonDraw()
sur l'appelinvalidate()
sur lui-même jusqu'à ce que l'objet finisse l'animation qu'il était censé faire. Cependant, dansTestB
, quand j'appelleinvalidate()
la vue ne se redessine jamais. Je suis sous l'impression que c'est le travail de ma vue parente d'appeler à nouveau la méthodeonDraw()
, mais ma vue parente n'appelle pas encore ledispatchDraw()
.
Je suppose que mes questions sont, pourquoi ma méthode onDraw()
de mon point de vue des parents ne sont jamais appelés à commencer? Quelles sont les méthodes dans la vue de mes parents qui sont censées être appelées quand l'un de ses enfants s'invalide? Est-ce que le parent est responsable de s'assurer que les enfants sont attirés ou qu'Android s'en occupe-t-il? Si Android répond à invalidate()
, pourquoi mon TestB
ne sera plus jamais dessiné?
pouvez-vous partager ce projet de démonstration du Viewgroup dans votre blog ou quelque part il sera très utile .. Merci compagnon .. – user1201239
dois-je ajouter le childView même si nous le spécifions en XML? – user1201239
Je suis désolé. Je n'ai pas de blog ou quoi que ce soit à télécharger. Je vais essayer d'être aussi utile que possible. Pour répondre à votre première question, non. Lorsque vous gonflez le fichier XML, l'enfant est contenu dans 'ViewGroup'. Le plus tôt vous pouvez le récupérer est 'onFinishInflate()'. Après cela, vous avez le choix. Soit obtenir vos enfants via la méthode 'getChildAt (int index)' ou utiliser 'findViewById (int id)'. L'index sera l'ordre dans lequel les enfants sont situés dans XML. Je ne sais pas comment fonctionne l'indexation avec les enfants au sein des enfants. – DeeV