Відповідь в кінці цього питання був заповнений, комбінуючи зауваження і рішення.
Питання
Я шукав навколо, але не знайшов нічого, що справді пояснює, чому 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>
Відповідь
Я даю тут відповідь, оскільки це справді поєднання відповідей та посилань нижче. Якщо я щось помиляюся, дайте мені знати.
Від чого фокус з 0dip layout_height або layouth_width?
Існує 3 загальних атрибути макета, які працюють із шириною та висотою
android:layout_height
android:layout_width
android:layout_weight
Коли LinearLayout
це вертикальне , то layout_weight
буде впливати на висоту дитини View
з ( ListView
). Установка layout_height
To 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
з ( ListView
). Установка layout_width
To 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
Якщо ви коли-небудь задавались питанням, чому getView(...)
телефонують стільки разів, як я, це виявляється пов’язано з wrap_content
.
Використання, wrap_content
як я використовував вище, призведе View
до вимірювання всіх дочірніх елементів, що призведе до подальшого часу процесора. Це вимірювання призведе getView(...)
до того, що вас покличуть. Зараз я це перевірив, і кількість getView(...)
викликів різко зменшується.
Коли я використовував wrap_content
по два ListView
с, мене getView(...)
викликали 3 рази для кожного рядка по одному ListView
і 4 рази для кожного рядка з іншого.
Змінивши це на рекомендоване 0dp
, getView(...)
викликався лише один раз для кожного рядка. Це досить поліпшення, але має більше спільного з уникаючи wrap_content
на ListView
ніж це робить 0dp
.
Однак пропозиція 0dp
суттєво покращує продуктивність через це.