Почему 0dp считается повышением производительности?
answer В конце этого вопроса был заполнен, объединяя замечания и решения.
QuestionЯ искал вокруг, но не нашел ничего, что действительно объясняет, почемуAndroid Lint а также некоторыеEclipse подсказки предлагают заменить некоторыеlayout_height
а такжеlayout_width
значения с0dp
.
Например, у меня естьListView
это было предложено изменить
Before
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1">
</ListView>
After
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
</ListView>
Точно так же это предложило изменения кListView item, Все они выглядят одинаково до и после изменений, но мне интересно понять, почему это повышение производительности.
У кого-нибудь есть объяснение почему? Если это поможет, вот общая схема с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>
Answer
Я вставляю здесь ответ, потому что это действительно комбинация ответов и ссылочных ссылок ниже. Если я что-то не так, дайте мне знать.
ОтВ чем заключается хитрость с 0dip layout_height или layouth_width?
Есть 3 общих атрибута макета, которые работают сwidth а такжеheight
android:layout_height
android:layout_width
android:layout_weight
КогдаLinearLayout
являетсяverticalтогдаlayout_weight
будет влиять наheight ребенкаView
с (ListView
). Настройкаlayout_height
в0dp
приведет к игнорированию этого атрибута.
Example
<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
являетсяhorizontalтогдаlayout_weight
будет влиять наwidth ребенкаView
с (ListView
). Настройкаlayout_width
в0dp
приведет к игнорированию этого атрибута.
Example
<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 developer в ответе ниже.
Также,Android Lint а такжеEclipse оба говорят, чтобы использовать0dip
, Из этого ответа ниже, вы можете использовать0dip
, 0dp
, 0px
и т. д., поскольку нулевой размер одинаков в любом из блоков.
Avoid wrap_content on 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
существенно улучшает производительность из-за этого.