La version précédente de ma question était trop verbeuse. Les gens ne pouvaient pas le comprendre, donc ce qui suit est une réécriture complète. Voir le edit history si vous êtes intéressé par l'ancienne version.OnSur mesure personnalisée: comment obtenir la largeur en fonction de la hauteur
Un parent RelativeLayout
envoie MeasureSpec
s à onMeasure
de son point de vue de l'enfant méthode afin de voir la taille de l'enfant voudrait être. Cela se produit en plusieurs passes.
Mon point de vue personnalisé
J'ai un custom view. Lorsque le contenu de la vue augmente, la hauteur de la vue augmente. Lorsque la vue atteint la hauteur maximale autorisée par le parent, la largeur de la vue augmente pour tout contenu supplémentaire (pour autant que wrap_content
ait été sélectionné pour la largeur). Ainsi, la largeur de la vue personnalisée dépend directement de ce que le parent dit que le maximum doit être.
Un enfant parent (inharmonieuse) Conversation
onMeasure
passe 1
Le parent RelativeLayout
dit mon avis, « Vous pouvez être une largeur up to900
et toute hauteur up to600
. Que dis-tu?" Mon point de vue dit: «Eh bien, à cette hauteur, je peux tout adapter avec une largeur de 100
.Je vais prendre une largeur de 100
et une hauteur de 600
."
onMeasure
passe 2
Le parent RelativeLayout
dit mon avis, « Vous me avez dit la dernière fois que vous vouliez une largeur de 100
, donc Fixons que comme une largeur exact. Maintenant, en fonction de cette largeur, quel genre de hauteur voulez-vous? Tout up to500
est OK. "
"Hey!" Mon avis répond. "Si vous me donnez seulement une hauteur maximale de 500
, alors 100
est trop étroit.J'ai besoin d'une largeur de pour cette hauteur.Mais bien, ayez votre chemin.Je ne vais pas enfreindre les règles (encore .. Je vais prendre une largeur de 100
et une hauteur de 500
. "
résultat final
Le parent RelativeLayout
attribue la vue une taille finale de 100
pour la largeur et 500
pour la hauteur. Ceci est bien sûr trop étroit pour la vue et une partie du contenu est découpée.
"Soupir", pense mon point de vue. "Pourquoi mon parent ne me laisse-t-il pas être plus large? Il y a beaucoup de place, peut-être que quelqu'un sur Stack Overflow peut me donner des conseils."
Je pense que c'est une question de vos unités, s'il vous plaît envisager d'utiliser une seule unité dp ou px en largeur et en hauteur. – Mohamed
@Mohamed, Mon exemple ici utilise uniquement px. – Suragch
Lorsque j'utilise votre vue personnalisée à l'intérieur d'un LinearLayout, cela fonctionne correctement. Avez-vous essayé cela? – Krish