2 votes

Est-il possible d'ajouter des vues à la mise en page dans l'événement onLayout ?

Est-il possible d'ajouter des vues à une mise en page pendant l'événement onLayout de l'un de ses enfants ?

c'est-à-dire

FrameLayout contient View, dans View.onLayout() je veux ajouter des vues au FrameLayout parent.

En effet, les vues que je dois dessiner sur le FrameLayout ont besoin des dimensions de la vue enfant (largeur, hauteur) pour les affecter à des positions particulières sur le FrameLayout.

J'ai déjà essayé de le faire, mais rien ne se dessine. Savez-vous comment je peux obtenir le même effet ? ou si je fais quelque chose de mal. Je ne sais pas pourquoi je suis incapable de dessiner les vues, événement si j'appelle invalidate.

Gracias.

3voto

Pavel Busko Points 54

Oui, c'est possible. J'ai résolu un problème similaire (placer un bouton de point de contrôle dans le FrameLayout au-dessus de SeekBar) en utilisant le code suivant (méthodes surchargées de SeekBar) :

@Override
protected void onLayout(final boolean changed, final int left, final int top, final int right, final int bottom) {
  super.onLayout(changed, left, top, right, bottom);
  View child = new Button(getContext());

  //child measuring
  int childWidthSpec = ViewGroup.getChildMeasureSpec(mWidthMeasureSpec, 0, LayoutParams.WRAP_CONTENT); //mWidthMeasureSpec is defined in onMeasure() method below
  int childHeightSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);//we let child view to be as tall as it wants to be
  child.measure(childWidthSpec, childHeightSpec);

  //find were to place checkpoint Button in FrameLayout over SeekBar
  int childLeft = (getWidth() * checkpointProgress) / getMax() - child.getMeasuredWidth();

  LayoutParams param = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
  param.gravity = Gravity.TOP;
  param.setMargins(childLeft, 0, 0, 0);

  //specifying 'param' doesn't work and is unnecessary for 1.6-2.1, but it does the work for 2.3
  parent.addView(child, firstCheckpointViewIndex + i, param);

  //this call does the work for 1.6-2.1, but does not and even is redundant for 2.3
  child.layout(childLeft, 0, childLeft + child.getMeasuredWidth(), child.getMeasuredHeight());
}

@Override
protected synchronized void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec)    {
  super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  //we save widthMeasureSpec in private field to use it for our child measurment in onLayout()
  mWidthMeasureSpec = widthMeasureSpec;
}

Il existe également ViewGroup.addViewInLayout() (elle est protégée, donc vous pouvez l'utiliser seulement si vous surchargez la méthode onLayout de votre Layout) dont la javadoc dit que son but est exactement ce dont nous discutons ici, mais je n'ai pas compris pourquoi elle est meilleure que addView(). Vous pouvez trouver son utilisation dans ListView .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X