Dlaczego 0dp jest uważany za zwiększenie wydajności?

Naodpowiedź na końcu tego pytania zostało wypełnione, łącząc uwagi i rozwiązania.

Pytanie

Szukałem w okolicy, ale nie znalazłem niczego, co naprawdę wyjaśnia dlaczegoAndroid Lint jak również niektóreZaćmienie podpowiedzi sugerują zastąpienie niektórychlayout_height ilayout_width wartości z0dp.

Na przykład mamListView zaproponowano zmianę

Przed

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

Po

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

Podobnie sugerował zmiany wElement ListView. Wszystkie wyglądają tak samo przed i po zmianach, ale jestem zainteresowany zrozumieniem, dlaczego są to czynniki zwiększające wydajność.

Czy ktoś ma wyjaśnienie dlaczego? Jeśli to pomoże, tutaj jest ogólny układ zListView.

<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>
Odpowiedź

Zamieszczam tutaj odpowiedź, ponieważ jest to naprawdę połączenie odpowiedzi i odnośników poniżej. Jeśli coś się mylę, daj mi znać.

ZJaka jest sztuczka z 0dip layout_height lub layouth_width?

Istnieją 3 ogólne atrybuty układu, które działająszerokość iwysokość

android:layout_heightandroid:layout_widthandroid:layout_weight

KiedyLinearLayout jestpionowy, a późniejlayout_weight wpłynie nawysokość dzieckaViews (ListView). Ustawianielayout_height do0dp spowoduje, że ten atrybut zostanie zignorowany.

Przykład

<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>

KiedyLinearLayout jestpoziomy, a późniejlayout_weight wpłynie naszerokość dzieckaViews (ListView). Ustawianielayout_width do0dp spowoduje, że ten atrybut zostanie zignorowany.

Przykład

<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>

Powodem, dla którego chcesz zignorować ten atrybut, jest to, że jeśli go nie zignorujesz, zostanie on użyty do obliczenia układu, który zużywa więcej czasu procesora.

Dodatkowo zapobiega to dezorientacji co do wyglądu układu przy użyciu kombinacji trzech atrybutów. Jest to wyróżnione przezProgramista @android w odpowiedzi poniżej.

Również,Android Lint iZaćmienie obaj mówią używać0dip. Z poniższej odpowiedzi możesz skorzystać0dip, 0dp, 0px, itp., ponieważ rozmiar zerowy jest taki sam w każdej jednostce.

Unikaj wrap_content na ListView

ZLayout_width z ListView

Jeśli kiedykolwiek zastanawiałeś się dlaczegogetView(...) jest nazywany tak wiele razy, jak ja, okazuje się być powiązany zwrap_content.

Za pomocąwrap_content tak jak użyłem powyżej spowoduje wszystkie dzieciViews do pomiaru, co spowoduje dalszy czas procesora. Ten pomiar spowoduje twojegetView(...) być nazywanym. Przetestowałem to i tyle razygetView(...) jest znacznie zmniejszona.

Kiedy korzystałemwrap_content na dwóchListViews,getView(...) był nazywany 3 razy dla każdego rzędu na jednymListView i 4 razy dla każdego rzędu po drugiej.

Zmiana na zalecaną0dp, getView(...) został wywołany tylko raz dla każdego wiersza. Jest to znaczna poprawa, ale ma więcej wspólnego z unikaniemwrap_content naListView niż robi0dp.

Jednak sugestia0dp z tego powodu znacznie poprawia wydajność.

questionAnswers(5)

yourAnswerToTheQuestion