Как сделать детей одинакового размера в Flow ConstraintLayout? - PullRequest
0 голосов
/ 01 июля 2019

У меня есть куча плиток, которые я хочу распределить по горизонтали по экрану. Они будут слишком широко отображаться в одной строке для большинства устройств, поэтому я бы хотел использовать ConstraintLayout с помощником Flow. Я могу заставить это работать.

Но я бы хотел убедиться, что каждая плитка имеет одинаковую ширину. В идеале каждая плитка должна быть такой же ширины, как и требуемая ширина самой широкой плитки. Как правильно убедиться, что каждый элемент в моем потоке имеет одинаковую ширину?

(Я пытался создать цепочку и использовать layout_constraintHorizontal_weight, но она просто сжимает каждую плитку в один ряд и препятствует течению потока.)

1 Ответ

0 голосов
/ 13 июля 2019

Я закончил тем, что добавил ViewTreeObserver , который создает ConstraintSet , который устанавливает размер дочерних элементов до появления макета. Это не красиво, но примерно так, как я хочу:

        final ConstraintLayout statContainer = findViewById(R.id.stat_container);

        statContainer.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
            @Override
            public boolean onPreDraw() {
                try {
                    ConstraintSet constraintSet = new ConstraintSet();
                    constraintSet.clone(statContainer);

                    // Determine a minimum width
                    int width = 0;
                    for (int i = 0; i < statContainer.getChildCount(); i++) {
                        View child = statContainer.getChildAt(i);
                        if (child instanceof Flow) {
                            continue;
                        }

                        int candidateWidth = child.getMeasuredWidth();
                        width = Math.max(width, candidateWidth);
                    }

                    // Don't allow any child to get too big
                    int max = statContainer.getWidth() / 3;

                    width = Math.min(width, max);

                    // Set that width
                    for (int i = 0; i < statContainer.getChildCount(); i++) {
                        View child = statContainer.getChildAt(i);
                        if (child instanceof Flow) {
                            continue;
                        }
                        constraintSet.constrainWidth(child.getId(), width);
                    }

                    constraintSet.applyTo(statContainer);
                    statContainer.invalidate();

                } finally {
                    statContainer.getViewTreeObserver().removeOnPreDrawListener(this);
                }

                return false;
            }
        });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...