Warum wird 0dp als Leistungssteigerung angesehen?

EinAntworten Am Ende wurde diese Frage ausgefüllt, die Bemerkungen und Lösungen kombiniert.

Frage

Ich habe mich umgesehen, aber nichts gefunden, was wirklich erklärt, warumAndroid Lint sowie einigeFinsternis Tipps schlagen vor, einige zu ersetzenlayout_height undlayout_width Werte mit0dp.

Zum Beispiel habe ich eineListView das wurde vorgeschlagen, geändert zu werden

Vor

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

Nach dem

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

Ebenso wurden Änderungen an a vorgeschlagenListView-Element. Diese sehen vor und nach den Änderungen alle gleich aus, aber ich bin daran interessiert zu verstehen, warum dies Leistungssteigerungen sind.

Hat jemand eine Erklärung warum? Wenn es hilft, hier ist das allgemeine Layout mit demListView.

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

Ich gebe hier eine Antwort ein, da es sich um eine Kombination aus Antworten und Links handelt, auf die unten verwiesen wird. Wenn ich etwas falsch mache, lass es mich wissen.

VonWas ist der Trick mit 0dip layout_height oder layouth_width?

Es gibt 3 allgemeine Layoutattribute, mit denen gearbeitet wirdBreite undHöhe

android:layout_heightandroid:layout_widthandroid:layout_weight

Wenn einLinearLayout istVertikale, dann ist dielayout_weight bewirkt dieHöhe Des kindesViews (ListView). Einstellen derlayout_height zu0dp bewirkt, dass dieses Attribut ignoriert wird.

Beispiel

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

Wenn einLinearLayout isthorizontal, dann ist dielayout_weight bewirkt dieBreite Des kindesViews (ListView). Einstellen derlayout_width zu0dp bewirkt, dass dieses Attribut ignoriert wird.

Beispiel

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

Der Grund, warum Sie das Attribut ignorieren möchten, besteht darin, dass es zur Berechnung des Layouts verwendet wird, das mehr CPU-Zeit benötigt, wenn Sie es nicht ignorieren.

Außerdem wird dadurch verhindert, dass bei Verwendung einer Kombination der drei Attribute Unklarheiten darüber entstehen, wie das Layout aussehen soll. Dies wird durch hervorgehoben@Android-Entwickler in einer Antwort unten.

Ebenfalls,Android Lint undFinsternis beide sagen zu gebrauchen0dip. Aus dieser Antwort können Sie unten verwenden0dip, 0dp, 0pxusw., da die Größe Null in allen Einheiten gleich ist.

Vermeiden Sie wrap_content in ListView

VonLayout_width einer ListView

Wenn Sie sich jemals gefragt haben, warumgetView(...) wird so oft genannt wie ich, es stellt sich heraus, dass es mit verwandt istwrap_content.

Verwendenwrap_content wie ich oben verwendet habe, wird alles Kind verursachenViews gemessen werden, was zu einer weiteren CPU-Zeit führt. Diese Messung verursacht IhregetView(...) heißen. Ich habe dies jetzt und die Anzahl der Male getestetgetView(...) genannt wird, wird dramatisch reduziert.

Als ich benutzt habewrap_content auf zweiListViews,getView(...) wurde 3 mal für jede Zeile in einer aufgerufenListView und 4 mal für jede Reihe in der anderen.

Ändern Sie dies auf die empfohlene0dp, getView(...) wurde nur einmal für jede Zeile aufgerufen. Dies ist eine ziemliche Verbesserung, hat aber mehr mit Vermeiden zu tunwrap_content auf einenListView als es das tut0dp.

Der Vorschlag von0dp verbessert dadurch die Leistung erheblich.

Antworten auf die Frage(5)

Ihre Antwort auf die Frage