Comment pouvez-vous dire si un modèle a été élaboré?
J'ai une vue personnalisée qui attire un défilement d'image bitmap à l'écran. Pour l'initialiser, j'ai besoin de passer à la taille, en pixels, de la mère objet de mise en page. Mais au cours de la onCreate et onResume fonctions, la Mise en page n'a pas été encore dessinés, et donc de mise en page.getMeasuredHeight() renvoie 0.
Comme une solution de contournement, j'ai ajouté un gestionnaire d'attendre une seconde, puis mesurer. Cela fonctionne, mais son bâclée, et je n'ai aucune idée de combien je peux découper le temps avant que je termine avant la mise en page pénètre.
Ce que je veux savoir, c'est, comment puis-je détecter quand un modèle devient-il dessiné? Est-il un événement ou d'un rappel?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez ajouter un arbre d'observateur à la mise en page. Cela devrait renvoyer la bonne largeur et la hauteur.
onCreate()
est appelé avant la présentation de l'enfant vues sont effectuées. Si la largeur et la hauteur n'est pas encore calculé. Pour obtenir la hauteur et la largeur, le mettre sur leonCreate()
méthode:PopupWindow.showAsDropdown
dansonGlobalLayoutListener
, mais il est indiqué au-dessus de la vue d'ancrage. La raison en est probablement qu'à l'époqueView.getLocatioinOnScreen
retour temporaire(non définitif) de la valeur. Comment puis-je faire?this.layout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
devrait lirelayout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
à consulter LinearLayout objet.onGlobalLayout()
n'est pas appelé quand nous serons de retour à partir d'un appel téléphonique. Solution: Vérifiezlayout.isShown()
d'abord avant de faire appel àaddOnGlobalLayoutListener
. SiisShown()
est vrai, la vue est déjà prêt. Si la valeur est false, nous avons mis à l'auditeur de savoir quand il est prêt.view.post(Runnable)
, plus propre et il fait la même chose.Vraiment un moyen facile est de simplement appeler
post()
sur votre mise en page. Cela permettra de exécuter votre code, la prochaine étape, après que votre point de vue a déjà été créé.Pour éviter obsolète code et des avertissements que vous pouvez utiliser:
Une autre réponse est:
Essayez de vérifier le point de Vue des dimensions à
onWindowFocusChanged
.Une alternative à la méthode habituelle est de l'insérer dans le dessin de la vue.
OnPreDrawListener
est appelé à de nombreuses reprises lors de l'affichage d'un point de vue, si il n'y a pas d'itération où votre point de vue est valable mesurée la largeur ou la hauteur. Cela exige que vous continuellement vérifier (view.getMeasuredWidth() <= 0
) ou de fixer une limite au nombre de fois que vous signez pour unemeasuredWidth
supérieur à zéro.Il ya aussi une chance que le point de vue ne sera jamais établi, ce qui peut indiquer d'autres problèmes avec votre code.
How can you tell when a layout has been drawn?
et de vous fournir 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 de votre solution devrait être évident.Simplement vérifier en appelant la méthode "post" sur votre mise en page ou de la vue
Quand
onMeasure
est appelé la vue est la mesure de la largeur/hauteur. Après cela, vous pouvez appelerlayout.getMeasuredHeight()
.