2011-09-22 5 views
5

J'ai créé une mise en page personnalisée qui étend ViewGroup. Tout fonctionne bien et je reçois la mise en page comme prévu.ViewGroup finish gonfle event

Je souhaite modifier dynamiquement un élément de la mise en page. Cependant, cela ne fonctionne pas car je l'appelle sur Créer et jusqu'à ce moment-là la totalité de la mise en page n'est pas réellement dessinée sur l'écran et n'a donc pas la taille réelle.

Y at-il un événement qui peut être utilisé pour savoir quand le gonflage de la mise en page est fait? J'ai essayé onFinishInflate mais cela ne fonctionnerait pas car Viewgroup a plusieurs vues et cela serait appelé plusieurs fois.

Je pense créer une interface dans la classe de mise en page personnalisée, mais je ne sais pas quand la déclencher.

Répondre

20

Si je comprends bien vos besoins correctement, un OnGlobalLayoutListener peut vous donner ce que vous avoir besoin.

View myView=findViewById(R.id.myView); 
    myView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
      @Override 
      public void onGlobalLayout() { 
       //At this point the layout is complete and the 
       //dimensions of myView and any child views are known. 
      } 
     }); 
+0

Je l'utilise depuis un certain temps pour ajuster les textures en textview, je n'ai jamais su que cela puisse aussi être utilisé pour ViewGroup. Merci pour l'aide! – PravinCG

2

Habituellement, lors de la création d'une mise en page personnalisée s'étendant View ou ViewGroup, vous devez remplacer protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) et protected void onLayout(boolean changed, int left, int top, int right, int bottom). Ceux-ci sont appelés pendant le processus d'inflation afin d'obtenir les informations de taille et de localisation liées à la vue. En outre, par la suite, si vous étendez ViewGroup vous devez appeler measure(int widthMeasureSpec, int heightMeasureSpec) et layout(int l, int t, int r, int b) sur chaque vue enfant contenue dans. (measure() est appelée dans onMeasure() et layout() est appelée dans onLayout()).

Quoi qu'il en soit, dans onMeasure(), vous faites généralement quelque chose comme ça.

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 
{ 
    // Gather this view's specs that were passed to it 
    int widthMode = MeasureSpec.getMode(widthMeasureSpec); 
    int widthSize = MeasureSpec.getSize(widthMeasureSpec); 
    int heightMode = MeasureSpec.getMode(heightMeasureSpec); 
    int heightSize = MeasureSpec.getSize(heightMeasureSpec); 

    int chosenWidth = DEFAULT_WIDTH; 
    int chosenHeight = DEFAULT_HEIGHT; 
    if(widthMode == MeasureSpec.AT_MOST || widthMode == MeasureSpec.EXACTLY) 
     chosenWidth = widthSize; 
    if(heightMode == MeasureSpec.AT_MOST || heightMode == MeasureSpec.EXACTLY) 
     chosenHeight = heightSize; 

    setMeasuredDimension(chosenWidth, chosenHeight); 

    *** NOW YOU KNOW THE DIMENSIONS OF THE LAYOUT *** 
} 

En onLayout() vous obtenez les coordonnées de pixels réels de la vue, afin que vous puissiez obtenir la taille physique comme ceci:

@Override 
protected void onLayout(boolean changed, int left, int top, int right, int bottom) 
{ 
    // Android coordinate system starts from the top-left 
    int width = right - left; 
    int height = bottom - top; 
} 
+0

Merci pour la réponse. J'ai fait tout ce que vous avez prescrit ma requête est que la valeur va être dynamique, comment puis-je transmettre ces données de l'activité et surtout quand (événement) ?? – PravinCG

+1

Ok. Je pensais que vous changiez la vue dynamiquement dans la vue. Si tel était le cas, vous pouvez utiliser ces deux méthodes pour trouver vos coordonnées (même avant qu'il ne soit visible). Une autre option peut utiliser 'onWindowFocusChanged()' qui fait partie de 'Activity'. Selon la documentation 'Appelée lorsque la fenêtre courante de l'activité gagne ou perd le focus. C'est le meilleur indicateur pour savoir si cette activité est visible pour l'utilisateur. L'implémentation par défaut efface l'état de suivi des clés. Vous devez donc toujours l'appeler. 'Je l'ai utilisé pour déterminer quand une fenêtre était en vue (donc gonflé). – DeeV

+0

+1, Merci pour la réponse. La méthode ci-dessus n'est pas la manière fiable de le faire mais pourrait fonctionner dans certains cas. – PravinCG