Le problème de base est que vous vous avez à attendre pour le tirage au sort de la phase pour les mesures réelles (en particulier avec la dynamique des valeurs comme l' wrap_content
ou match_parent
), mais généralement, cette phase n'a pas été terminé en hausse de onResume()
. Si vous avez besoin d'une solution de contournement pour l'attente pour cette phase. Il y a, ce sont les différentes solutions possibles à cela:
1. Écouter Dessin/Mise en page des Événements: ViewTreeObserver
Un ViewTreeObserver est exclu pour les différentes dessin événements. Généralement l' OnGlobalLayoutListener
est ce que vous voulez pour obtenir la mesure, de sorte que le code de l'auditeur sera appelé après le schéma de phase, de sorte que les mesures sont prêts:
view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
mScrollView.post(new Runnable() {
public void run() {
view.getHeight(); //height is ready
}
});
}
});
Mais méfiez-vous que ce sera appelée à chaque fois que quelque chose se relooké (e.g si vous définissez un point de vue invisible ou similaire), donc n'oubliez pas de supprimer cette écoute si vous en avez le plus besoin avec:
public void removeGlobalOnLayoutListener (ViewTreeObserver.OnGlobalLayoutListener victim)
dans le SDK Lvl < 16
ou
public void removeOnGlobalLayoutListener (ViewTreeObserver.OnGlobalLayoutListener victim)
dans le SDK Lvl >= 16
2. Ajouter un exécutable de la mise en page de la file d'attente: la Vue.post()
Pas très bien connue et ma solution préférée. Fondamentalement, suffit d'utiliser le point de Vue de la méthode post avec votre propre exécutable. Au fond, les files d'attente de votre code après le point de vue de la mesure, mise en page, etc. comme indiqué par Romain Guy:
L'INTERFACE utilisateur de la file d'attente d'événements va traiter les événements dans l'ordre. Après
setContentView() est appelée, la file d'attente d'événements contiendra un message
en demandant une nouvelle disposition, de sorte que vous publiez à la file d'attente va se passer
après la passe de mise en page
Exemple:
final View view=//smth;
...
view.post(new Runnable() {
@Override
public void run() {
view.getHeight(); //height is ready
}
});
L'avantage par rapport ViewTreeObserver
:
- votre code est exécutée une seule fois et vous n'avez pas à désactiver l'Observateur après l'exécution qui peut être embêtant
- moins verbeux syntaxe
Références:
3. Écraser les points de Vue de la Méthode onLayout
Ce n'est pratique dans certains cas, lorsque l'logique peut être moduled dans la vue elle-même, sinon c'est assez verbeux et syntaxe lourde.
view = new View(this) {
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
view.getHeight(); //height is ready
}
};
Aussi l'esprit, que onLayout sera appelé de nombreuses fois, être attentif à ce que vous faites dans la méthode, ou de désactiver votre code après la première fois
Supplémentaires: Arriver staticly les mesures définies
Si il suffit d'obtenir l'définis de manière statique hauteur/largeur, tu peux faire ça avec:
Mais vous l'esprit, qui peut être différente de ce à la largeur/hauteur après le tirage. La javadoc décrit la différence parfaitement:
De la taille d'un point de vue est exprimé avec une largeur et une hauteur. Vue
effectivement posséder deux paires de valeurs de largeur et hauteur.
La première paire est connu comme mesuré la largeur et la hauteur mesurée. Ces
dimensions définir comment grand une vue veut être à l'intérieur de ses parents (voir
Mise en page pour plus de détails.) Les dimensions mesurées peuvent être obtenus par
l'appel de getMeasuredWidth() et getMeasuredHeight().
La seconde paire est simplement connu comme la largeur et la hauteur, ou parfois
le dessin de la largeur et de la hauteur de dessin. Ces dimensions définir le réel
la taille de la vue sur l'écran, au moment du dessin et après sa mise en page. Ces
les valeurs peuvent, mais ne doivent pas, être différente de la largeur mesurée
et la hauteur. La largeur et la hauteur peuvent être obtenues en appelant getWidth()
et getHeight().