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_heightund layout_widthWerte 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_heightandroid:layout_widthandroid:layout_weight
Wenn eine LinearLayoutist vertikal , dann ist das layout_weightdie Wirkung der Höhe des Kindes View(s ListView). Durch Setzen von layout_heightto 0dpwird 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 LinearLayoutist horizontal , dann ist das layout_weightdie Bewirkung Breite des Kindes View(s ListView). Durch Setzen von layout_widthto 0dpwird 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, 0pxusw. , 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_contentwie oben verwenden, werden alle untergeordneten ViewElemente 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_contentauf zwei ListViews verwendet habe, getView(...)wurde 3 Mal für jede Zeile auf einer ListViewund 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_contentvon a zu tun als mit ListViewdem 0dp.
Der Vorschlag von 0dpverbessert jedoch die Leistung aus diesem Grund erheblich.