Пользовательская ViewGroup неверна onLayout - PullRequest
0 голосов
/ 02 марта 2012

Я пытаюсь написать свой собственный класс макета.Но у меня проблемы с onLayout.Если я расширяю LinearLayout и заставляю его делать onLayout, и я вызываю super.onMeasure () в моем onMeasure, все работает.Но не работает расширение ViewGroup.То, что показано, - это то, что первый левый большинство детей отображается правильно, а остальные не отображаются или имеют неправильный размер.

import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;

class ManualPanel extends ViewGroup
{
    private int totalDivs;
    private int[] sizesArr;

    public ManualPanel(final Context context)
    {
        this(context, null);
    }

    public ManualPanel(final Context context, final AttributeSet attrs)
    {
        super(context, attrs);

        final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ManualPanel);

        final String[] sizeStr = a.getString(R.styleable.ManualPanel_sizes).split("/");
        final String[] fracArr = sizeStr[0].split(",");
        a.recycle();

        int sum = 0;
        sizesArr = new int[fracArr.length];
        for (int i = 0; i < sizesArr.length; i++) {
            sizesArr[i] = Integer.valueOf(fracArr[i]);
            sum += sizesArr[i];
        }
        totalDivs = Math.max(sum, Integer.valueOf(sizeStr[1]));
    }

    @Override
    protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec)
    {
        final int children = getChildCount();
        final int totalWidth = MeasureSpec.getSize(widthMeasureSpec);
        final int totalHeight = MeasureSpec.getSize(heightMeasureSpec);

        totalDivs = Math.max(totalDivs, children);

        final int[] arr = IntArray.copyOf(sizesArr, children);
        final int width[] = new int[children];
        int sum = 0;

        for (int i = 0; i < children; i++) {
            width[i] = (arr[i] * totalWidth) / totalDivs;
            sum += width[i];
        }
        for (int i = 0, diff = totalWidth - sum; diff > 0; i = ++i % children) {
            width[i]++;
            diff--;
        }
        for (int i = 0; i < children; i++) {
            final View view = getChildAt(i);
            final LayoutParams lp = view.getLayoutParams();

            lp.width = width[i];
            view.setLayoutParams(lp);
            view.measure(MeasureSpec.EXACTLY | lp.width, MeasureSpec.EXACTLY | totalHeight);
        //  view.measure(MeasureSpec.AT_MOST | lp.width, MeasureSpec.AT_MOST | totalHeight);
        }
        setMeasuredDimension(totalWidth, totalHeight);
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b)
    {
        final int children = getChildCount(), height = getMeasuredHeight();
        for (int i = 0; i < children; i++) {
            final View view = getChildAt(i);

            if (view.getVisibility() != View.VISIBLE)
                continue;

            final int width = view.getMeasuredWidth();
            view.layout(l, 0, left + width, height);
            l += width;
        }
    }
}

Ответы [ 2 ]

1 голос
/ 02 марта 2012

ViewGroup не знает, как разместить детей. Или как их нарисовать. Ты должен сделать это сам.

0 голосов
/ 02 марта 2012

Я не пробовал ваш макет в действии.Но вот что я вижу.Посмотрите на вашу строку

view.layout(l, 0, left + width, height);

Кажется, ваша переменная left всегда равна нулю, поскольку вы не меняете ее внутри цикла.

...