J'ai une vue personnalisée qui dessine un bitmap défilant à l'écran. Afin de l'initialiser, j'ai besoin de passer la taille en pixels de l'objet de disposition parent. Mais pendant les fonctions onCreate et onResume, la disposition n'a pas encore été dessinée, et donc layout.getMeasuredHeight () renvoie 0.
Comme solution de contournement, j'ai ajouté un gestionnaire pour attendre une seconde, puis mesurer. Cela fonctionne, mais c'est bâclé, et je n'ai aucune idée de combien je peux couper le temps avant de finir avant que la mise en page ne soit dessinée.
Ce que je veux savoir, c'est comment savoir quand une mise en page est dessinée? Y a-t-il un événement ou un rappel?
la source
view.post(Runnable)
, il est plus propre et il fait la même chose.Un moyen très simple consiste simplement à appeler
post()
votre mise en page. Cela exécutera votre code à l'étape suivante, une fois votre vue déjà créée.la source
Pour éviter le code obsolète et les avertissements, vous pouvez utiliser:
la source
Mieux avec les fonctions d'extension kotlin
la source
Une autre réponse est:
essayez de vérifier les dimensions de la vue à
onWindowFocusChanged
.la source
Une alternative aux méthodes habituelles consiste à accrocher le dessin de la vue.
OnPreDrawListener
est appelé plusieurs fois lors de l'affichage d'une vue, il n'y a donc pas d'itération spécifique où votre vue a une largeur ou une hauteur mesurée valide. Cela nécessite que vous vérifiiez continuellement (view.getMeasuredWidth() <= 0
) ou définissiez une limite au nombre de fois où vousmeasuredWidth
supérieure à zéro.Il est également possible que la vue ne soit jamais dessinée, ce qui peut indiquer d'autres problèmes avec votre code.
la source
How can you tell when a layout has been drawn?
et vous fournissez une méthode où vous appelez unOnPreDrawListener
etdon't stop interrogating that view until it has provided you with a reasonable answer
donc les objections à votre solution devraient être évidentes.Vérifiez-le simplement en appelant la méthode de publication sur votre mise en page ou vue
la source
post
va simplement mettre en file d'attente le runnable pour l'exécuter, cela ne garantit pas que la vue est mesurée, encore moins dessinée.Quand
onMeasure
est appelé, la vue obtient sa largeur / hauteur mesurée. Après cela, vous pouvez appelerlayout.getMeasuredHeight()
.la source