Warum wird 0dp als Leistungssteigerung angesehen?
EinAntworten Am Ende wurde diese Frage ausgefüllt, die Bemerkungen und Lösungen kombiniert.
FrageIch 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>
AntwortenIch 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_height
android:layout_width
android:layout_weight
Wenn einLinearLayout
istVertikale, dann ist dielayout_weight
bewirkt dieHöhe Des kindesView
s (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 kindesView
s (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
, 0px
usw., 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 verursachenView
s 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 zweiListView
s,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.