7 votes

OnMeasure n'est pas appelé dans mon viewgroup personnalisé android

Je dispose de deux viewgroups personnalisés, superViewGroup et subViewGroup. Le subviewgroup contient des vues. J'ajoute mon superviewgroup à un linearLayout et les subViewGroups à mon superviewgroup.

Le onMeasure() de superviewgroup est appelé mais pas celui de subviewgroup. Mais dans les deux cas, la méthode onLayout() est appelée.

Le code est le suivant

public class SuperViewGroup extends ViewGroup{

    public SuperViewGroup(Context context) {
        super(context);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        Log.i("boxchart","À L'INTÉRIEUR DE LA MESURE DE SUPER VIEWGROUP");
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {

        final int count = getChildCount();

        for (int i = 0; i < count; i++) {
            final View child = getChildAt(i);
            if (child.getVisibility() != View.GONE) {
                child.layout(0, 0, getWidth(), getHeight());

            }
        }

    }

}

public class SubViewGroup extends ViewGroup{

    public SubViewGroup(Context context) {
        super(context);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        Log.i("boxchart","À L'INTÉRIEUR DE LA MESURE DE SUB VIEWGROUP");
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {

        final int count = getChildCount();

        for (int i = 0; i < count; i++) {
            final View child = getChildAt(i);
            if (child.getVisibility() != View.GONE) {
                child.layout(0, 0, getWidth(), getHeight());

            }
        }

    }

}

Les commentaires sont appréciés. Merci d'avance.

7voto

Chris.Jenkins Points 5261

Parce que vous devez réellement transmettre la mesure aux vues enfants :

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    Log.i("boxchart","À L'INTÉRIEUR DE LA MESURE DE LA SUPER CLASSE VIEWGROUP");
    final int count = getChildCount();
    for (int i = 0; i < count; i++) {
        final View child = getChildAt(i);
        if (child.getVisibility() != View.GONE) {
            //Make or work out measurements for children here (MeasureSpec.make...)
            measureChild (child, widthMeasureSpec, heightMeasureSpec);
        }
    }
}

Sinon, vous ne mesurez jamais réellement vos enfants. C'est à vous de décider comment le faire. Juste parce que votre SuperViewGroup est dans un agencement linéaire, votre SuperViewGroup prend la responsabilité de mesurer ses enfants.

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