Почему 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

ОтLayout_width ListView

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

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

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

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

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

Ответы на вопрос(5)

Ваш ответ на вопрос