Intereting Posts
Как получить контактную информацию URI Несоответствие обнаружено в RecyclerView, Как изменить содержимое RecyclerView при прокрутке Создание фрагмента: конструктор vs newInstance () Как программно включить GPS в Android Cupcake Уведомление об обновлении приложений для Android Ошибка индекса Android за пределами границ без кода приложения в трассировке стека Android GUI-архитектура – отношение между поверхностью / представлением / окном / холстом Как вырезать фрагмент Как обнаружить устройство – Android-телефон или планшет Android? API уведомлений в браузере Android Chrome Как предотвратить масштабирование в Android Imageview? Как разработать приложение с надстройками? Экстрактинг Zip на SD-карту происходит очень медленно. Как я могу оптимизировать производительность? Как остановить активность в android, используя намерение? Как прослушивать изменение состояния в виджетах SwitchCompat?

Почему 0dp считается улучшением производительности?

Ответ в конце этого вопроса был заполнен, сочетая замечания и решения.

Вопрос

Я искал, но не нашел ничего, что действительно объясняет, почему Android Lint, а также некоторые подсказки Eclipse предлагают заменить некоторые значения layout_height и layout_width с помощью 0dp .

Например, у меня есть ListView который предлагается изменить

До

 <ListView android:id="@android:id/list" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1"> </ListView> 

После

 <ListView android:id="@android:id/list" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"> </ListView> 

Аналогично, он предложил изменения в элементе ListView . Все они выглядят одинаково до и после изменений, но мне интересно понять, почему это ускорители производительности.

У кого-нибудь есть объяснение, почему? Если это помогает, вот общий макет с ListView .

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ImageView android:id="@+id/logo_splash" android:layout_width="match_parent" android:layout_height="wrap_content"> </ImageView> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:background="@color/background" android:layout_below="@id/logo_splash"> <ListView android:id="@android:id/list" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"> </ListView> <TextView android:id="@android:id/empty" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/no_upcoming" /> </LinearLayout> </RelativeLayout> 

Ответ

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

From Что такое трюк с 0dip layout_height или layouth_width?

Существует 3 основных атрибута макета, которые работают с шириной и высотой

  1. android:layout_height
  2. android:layout_width
  3. android:layout_weight

Когда LinearLayout является вертикальным , то layout_weight будет влиять на высоту дочернего View s ( ListView ). Установка layout_height в 0dp приведет к игнорированию этого атрибута.

пример

 <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <ListView android:id="@android:id/list" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"> </ListView> </LinearLayout> 

Когда LinearLayout является горизонтальным , тогда layout_weight будет влиять на ширину дочернего View s ( ListView ). Установка layout_width в 0dp приведет к игнорированию этого атрибута.

пример

 <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal"> <ListView android:id="@android:id/list" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1"> </ListView> </LinearLayout> 

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

Кроме того, это предотвращает любую путаницу в отношении того, как должен выглядеть макет при использовании комбинации трех атрибутов. Это подчеркивается разработчиком @android в ответе ниже.

Кроме того, Android Lint и Eclipse говорят, что используют 0dip . Из этого ниже ответа вы можете использовать 0dip , 0dp , 0px и т. Д., Так как нулевой размер одинаковый для любого из блоков.

Избегайте wrap_content в ListView

Из Layout_width в ListView

Если вы когда-нибудь задавались вопросом, почему getView(...) вызывается так много раз, как у меня, он оказывается связанным с wrap_content .

Использование wrap_content как я использовал выше, приведет к измерению всех дочерних View s, что приведет к дальнейшему времени процессора. Это измерение приведет к getView(...) . Я сейчас проверил это, и количество раз, когда getView(...) вызывается, резко сокращается.

Когда я использовал wrap_content для двух ListView s, getView(...) вызывался 3 раза для каждой строки в одном ListView и 4 раза для каждой строки на другой.

Изменяя это на рекомендуемый 0dp , getView(...) вызывался только один раз для каждой строки. Это довольно улучшилось, но больше связано с тем, чтобы исключить wrap_content в ListView чем 0dp .

Из-за этого предложение 0dp существенно повышает производительность.

Solutions Collecting From Web of "Почему 0dp считается улучшением производительности?"

Прежде всего у вас есть это,

 <ListView android:id="@android:id/list" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1"> </ListView> 

Никогда не используйте высоту ListView как wrap_content, что приведет к проблемам. Here почему и this answer .

Дальше больше,

Я искал, но не нашел ничего, что действительно объясняет, почему Android Lint, а также некоторые подсказки Eclipse предлагают заменить некоторые значения layout_height и layout_width на 0dp.

Это связано с тем, что вы используете layout_weight = "1" что означает, что ListView имеет высоту, максимально доступную для нее. Таким образом, в этом случае нет необходимости использовать layout_height = "wrap_content" просто измените его на android:layout_height="0dp" а высота ListView будет управляться layout_weight = "1" .

Поэтому, когда android: layout_weight используется в представлении X, а LinearLayout является горизонтальным, тогда андроид X: layout_width просто игнорируется.

Аналогично, когда android: layout_weight используется на View X, а LinearLayout – вертикально, тогда андроид X: layout_height игнорируется.

Это на самом деле означает, что вы можете поместить что-нибудь в те игнорируемые поля: 0dp или fill_parent или wrap_content. Это не имеет значения. Но рекомендуется использовать 0dp, поэтому View не делает дополнительного вычисления их высоты или ширины (которые затем игнорируются). Этот небольшой трюк просто экономит циклы процессора.

из :

Каков трюк с 0dip layout_height или layouth_width?

Насколько я знаю, существует разница между использованием 0dp (или 0px btw, это то же самое, поскольку 0 равно 0, независимо от того, что здесь находится), и wrap_content или fill_parent (или match_parent, это то же самое).

Это зависит от веса, который вы используете. Если вы используете только вес 1, все они выглядят одинаково, но значение всегда отличается, и это важно для производительности.

Чтобы показать это, попробуйте следующее:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/textView1" android:layout_width="match_parent" android:layout_height="0px" android:text="1" android:background="#ffff0000" android:layout_weight="1" android:gravity="center" android:textColor="#ffffffff" android:textSize="20sp" /> <TextView android:id="@+id/textView2" android:layout_width="match_parent" android:layout_height="0px" android:text="2" android:background="#ff00ff00" android:layout_weight="2" android:gravity="center" android:textColor="#ffffffff" android:textSize="20sp" /> <TextView android:id="@+id/textView3" android:layout_width="match_parent" android:layout_height="0px" android:text="3" android:background="#ff0000ff" android:layout_weight="3" android:gravity="center" android:textColor="#ffffffff" android:textSize="20sp" /> </LinearLayout> 

А затем попытайтесь заменить 0px на match_parent. Вы увидите, что результат совсем другой.

Как правило, для лучшего понимания и для лучшей производительности вы хотели бы использовать 0px.

LinearLayout измеряет все дочерние layout_width layout_height значениями layout_width / layout_height , а затем делит оставшееся пространство (которое может быть отрицательным) в соответствии с значениями layout_weight .

0dp более эффективен, чем wrap_content в этом случае, потому что более эффективно просто использовать ноль для исходной высоты, а затем разделить полную высоту родителя на основе веса, чем сначала измерять ребенка, а затем разделить остаток на основе веса.

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

Внимание! Использование android: layout_height = "0dp"

Я обнаружил, что в ListView (с рекомендуемой View recycling с использованием convertView см., Например, http://lucasr.org/2012/04/05/performance-tips-for-androids-listview/ ), установка android: layout_height = " 0dp "для строки TextView может привести к усечению текста для многострочного текстового содержимого.

Всякий раз, когда объект TextView, который ранее использовался для отображения текста, который был установлен в одной строке, перерабатывается для отображения более длинного текста, который требует более одной строки, этот текст усекается в одну строку.

Проблема вылечивается с помощью android: layout_height = "wrap_content"