Я написал пару файлов макетов, где я использовал layout_weight
атрибут, чтобы создать соотношение между различными видами.
В какой-то момент я начинаю получать предупреждения о вложенных весах.
Итак, мне интересно, почему вложенные веса плохо влияют на производительность, и существует ли более эффективный способ создания постоянного соотношения между размерами представления, который можно использовать для экранов разных размеров и при этом не нужно указывать большое количество значений dpi измерения Через несколько файлов макетов (я имею в виду для разных размеров экрана).
Спасибо!
android
android-layout
performance
MobileCushion
источник
источник
Ответы:
Вложенные веса плохо влияют на производительность, потому что:
Лучше использовать RelativeLayout s и настроить вид в соответствии с местами других видов без использования определенных значений dpi.
источник
Обновление: Как мы знаем, библиотека поддержки процентов устарела с уровня API 26.
ConstraintLayout
Это новый способ достижения такой же плоской XML-структуры.Обновленный проект Github
Обновленные образцы:
Обновление: отличные новости android процент поддержки библиотека решает нашу проблему производительности и вложенного грязного взвешенного
LinearLayout
Рассмотрим этот простой макет, чтобы продемонстрировать то же самое.
Избегайте снижения производительности, вложенного
LinearLayout
с весами. Действительно потрясающе !!!.источник
Я думаю (и я, вероятно, буду в восторге от этого), но снова я думаю, что мой телефон имеет четырехъядерный процессор, чтобы конкурировать (если не полностью уничтожить) большинство домашних компьютеров людей.
Я также думаю, что такого рода аппаратные возможности - будущее телефонов.
Поэтому я прихожу к выводу, что, пока вы не увлекаетесь вложением (в MHO макет никогда не должен иметь глубину более 4-х уровней, и если это так, то вы, вероятно, делаете это неправильно), ваш телефон может заботиться меньше о весах.
Есть много вещей, которые вы можете сделать, которые будут иметь гораздо более далеко идущий эффект на производительность, чем беспокоиться о том, что ваш процессор выполняет некоторые дополнительные математические операции.
(обратите внимание, что я немного юмористичен, и поэтому не стоит воспринимать что-либо слишком серьезно из этого поста, кроме идеи о том, что сначала нужно оптимизировать другие вещи, и что беспокойство по поводу веса на 2-3 уровня не помогает Ваше здоровье)
источник
Основная причина, по которой вложенные веса являются плохими, заключается в том, что когда в макете есть дочерние элементы с весом, его необходимо измерять дважды (я думаю, что это упоминается в предупреждении о задержке). Это означает, что взвешенный макет, который также содержит взвешенный макет, должен измеряться четыре раза, и каждый добавляемый вами «слой» весов увеличивает меры со степенью двойки.
В ICS (уровень API 14)
GridLayout
был добавлен элемент, который позволяет использовать простые и «плоские» решения для многих макетов, для которых ранее требовались весовые коэффициенты. Если вы разрабатываете для более ранних версий Android, вам будет немного сложнее снимать веса, но использованиеRelativeLayout
и выравнивание максимально возможного размера вашего макета в этой кабине обычно удаляет много вложенных весов.источник
GridLayout
илиRelativeLayout
. НапримерGridLayout
: «GridLayout не обеспечивает поддержку принципа веса, как определено в весе. В общем, поэтому невозможно настроить GridLayout для распределения избыточного пространства между несколькими компонентами».Существует простое решение, позволяющее избежать вложенных LinearLayouts с весами - просто используйте Tablelayout с weightSum и вложенный LinearLayout с weightSum - Tablelayout имеет те же атрибуты, что и LinearLayout (ориентация, weightSum, layout_weight и т. Д.) И не показывает сообщение - "вложенные веса плохо для производительности
Пример:
источник
Я думаю, что единственной альтернативой является создание функции, которая будет вызываться onResume и будет устанавливать все размеры и позиции. В любом случае, по весу вы можете установить только размеры, но не отступы (таким образом, макеты становятся еще более сложными), нет textSize (невозможно это как-то компенсировать), не говоря уже о таких вещах, как количество строк.
источник