Почему вложенные веса плохо подходят для производительности? Альтернативы?

Я написал несколько файлов макетов, в которых я использовал атрибут layout_weight для создания отношения между разными представлениями.

В какой-то момент я начинаю получать предупреждения lint о вложенных весах.

Итак, мне интересно, почему вложенные веса плохо относятся к производительности, и если есть более эффективный способ создать постоянное соотношение между размерами представления, которые могут использоваться для разных размеров экрана, и это не обязательно должно указывать много (по разным размерам экрана, я имею в виду).

Спасибо!

Ответ 1

Вложенные веса плохи для производительности, потому что:

Весы макета требуют, чтобы виджет измерялся дважды. Когда LinearLayout с ненулевыми весами вложен внутри другого LinearLayout с ненулевыми весами, затем количество измерений экспоненциально возрастать.

Всегда лучше использовать RelativeLayout и настраивать ваше представление в соответствии с местами других представлений без использования определенных значений dpi.

Ответ 2

Обновление: Отличная новостная поддержка для поддержки андроидных процентов помогает решить нашу проблему производительности и вложенных беспорядочно взвешенных LinearLayout

compile 'com.android.support:percent:23.0.0'

Демо ЗДЕСЬ

Github ЗДЕСЬ

Рассмотрим этот простой макет, чтобы продемонстрировать то же самое.

процент поддержки libray demo

<android.support.percent.PercentRelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:id="@+id/fifty_huntv"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="#ff7acfff"
        android:text="20% - 50%"
        android:textColor="@android:color/white"
        app:layout_heightPercent="20%"
        app:layout_widthPercent="50%" />
    <TextView
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_toRightOf="@id/fifty_huntv"
        android:background="#ffff5566"
        android:text="80%-50%"
        app:layout_heightPercent="80%"
        app:layout_widthPercent="50%"
        />

</android.support.percent.PercentRelativeLayout>

Избегайте деградации производительности вложенных LinearLayout с весами. Действительно удивительный!!!.

Ответ 3

Я думаю (и я, вероятно, буду пылким для этого), но опять же я думаю, что мой телефон имеет четырехъядерный процессор, чтобы конкурировать (если не полностью уничтожать) большинство людей на домашнем ПК.

Я также считаю, что этот вид аппаратных возможностей - будущее телефонов.

Итак, я прихожу к выводу, что до тех пор, пока вы не будете увлекаться гнездом (в MHO макет никогда не должен быть более 4 уровней в глубину, и если это вы, вероятно, ошибаетесь), ваш телефон меньше заботится о наличии весов.

Есть много вещей, которые вы можете сделать, которые будут иметь гораздо более далекий эффект на производительность, а затем беспокоиться о том, что ваш процессор выполняет некоторую дополнительную математику.

(обратите внимание, что я немного юмористичен и поэтому не воспринимаю что-либо слишком серьезно из этого поста, иначе идея о том, что есть другие вещи, которые вы должны сначала оптимизировать, и что беспокоиться о 2-3-уровневом глубоком весе не помогает вашему здоровью)

Ответ 4

Основная причина, почему вложенные веса плохи, заключается в том, что когда в макете есть дети с весом, ее нужно измерять дважды (я думаю, что это упоминается в предупреждении lint-warning). Это означает, что взвешенная компоновка, которая также содержит взвешенную компоновку, должна измеряться четыре раза, и каждый "уровень" весов, которые вы добавляете, увеличивает количество мер с силой в два.

В ICS (уровень API 14) добавлен GridLayout, который позволяет использовать простые и "плоские" решения для многих макетов, которые ранее требовали весов. Если вы разрабатываете более ранние версии Android, вам будет немного сложнее удалить весы, но с помощью RelativeLayout и сглаживания, насколько возможно, вашего макета в эту кабину, обычно удаляйте много вложенных весов.

Ответ 5

Я думаю, единственной альтернативой является создание функции, которая будет называться onResume и будет устанавливать все размеры и позиции. Во всяком случае, по весу вы можете устанавливать только размеры, но без дополнений (поэтому макеты становятся еще более сложными), no textSize (это невозможно как-то компенсировать), не говоря уже о таких вещах, как количество строк.