Eine Antwort am Ende dieser Frage wurde ausgefüllt und kombiniert Bemerkungen und Lösungen.
Frage
Ich habe mich umgesehen, aber nichts gefunden, was wirklich erklärt, warum Android Lint sowie einige Eclipse- Hinweise vorschlagen, einige layout_height
und layout_width
Werte durch zu ersetzen 0dp
.
Zum Beispiel habe ich eine ListView
, die vorgeschlagen wurde, 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
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
</ListView>
In ähnlicher Weise wurden Änderungen an einem ListView-Element vorgeschlagen . Diese sehen vor und nach den Änderungen alle gleich aus, aber ich bin daran interessiert zu verstehen, warum dies Leistungssteigerer sind.
Hat jemand eine Erklärung warum? Wenn es hilft, ist hier das allgemeine Layout mit dem 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>
Antworten
Ich gebe hier eine Antwort ein, weil es wirklich eine Kombination aus Antworten und Links ist, auf die unten verwiesen wird. Wenn ich in etwas falsch liege, lass es mich wissen.
Von Was ist der Trick mit 0dip layout_height oder layouth_width?
Es gibt 3 allgemeine Layoutattribute, die mit Breite und Höhe arbeiten
android:layout_height
android:layout_width
android:layout_weight
Wenn eine LinearLayout
ist vertikal , dann ist das layout_weight
die Wirkung der Höhe des Kindes View
(s ListView
). Durch Setzen von layout_height
to 0dp
wird dieses Attribut ignoriert.
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 eine LinearLayout
ist horizontal , dann ist das layout_weight
die Bewirkung Breite des Kindes View
(s ListView
). Durch Setzen von layout_width
to 0dp
wird dieses Attribut ignoriert.
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, das Attribut ignorieren zu wollen, ist, dass wenn Sie es nicht ignorieren, es verwendet wird, um das Layout zu berechnen, das mehr CPU-Zeit benötigt.
Dies verhindert außerdem Verwirrung darüber, wie das Layout aussehen soll, wenn eine Kombination der drei Attribute verwendet wird. Dies wird vom @ android-Entwickler in einer Antwort unten hervorgehoben.
Auch Android Lint und Eclipse sagen beide zu verwenden 0dip
. Von der Antwort unten, können Sie verwenden 0dip
, 0dp
, 0px
usw. , da eine Null - Größe ist das gleiche in einen der Einheiten.
Vermeiden Sie wrap_content in ListView
Aus Layoutbreite einer ListView
Wenn Sie sich jemals gefragt haben, warum getView(...)
so oft angerufen wird wie ich, stellt sich heraus, dass es damit zusammenhängt wrap_content
.
Wenn Sie wrap_content
wie oben verwenden, werden alle untergeordneten View
Elemente gemessen, was zu einer weiteren CPU-Zeit führt. Diese Messung führt dazu getView(...)
, dass Sie angerufen werden. Ich habe dies jetzt getestet und die Anzahl der Aufrufe getView(...)
wird drastisch reduziert.
Wenn ich wrap_content
auf zwei ListView
s verwendet habe, getView(...)
wurde 3 Mal für jede Zeile auf einer ListView
und 4 Mal für jede Zeile auf der anderen aufgerufen .
Dies zu ändern , auf die empfohlene 0dp
, getView(...)
wurde für jede Zeile nur einmal aufgerufen. Dies ist eine ziemliche Verbesserung, hat aber mehr mit dem Vermeiden wrap_content
von a zu tun als mit ListView
dem 0dp
.
Der Vorschlag von 0dp
verbessert jedoch die Leistung aus diesem Grund erheblich.