Ich habe einige Layoutdateien geschrieben, in denen ich das layout_weight
Attribut verwendet habe, um ein Verhältnis zwischen verschiedenen Ansichten zu erstellen.
Irgendwann bekomme ich Flusenwarnungen über verschachtelte Gewichte.
Daher frage ich mich, warum verschachtelte Gewichte die Leistung beeinträchtigen und ob es eine effizientere Möglichkeit gibt, ein konstantes Verhältnis zwischen Ansichtsdimensionen zu erstellen, die für verschiedene Bildschirmgrößen verwendet werden können und für die nicht viele Dimensions-dpi-Werte angegeben werden müssen durch mehrere Layoutdateien (für verschiedene Bildschirmgrößen meine ich).
Danke dir!
android
android-layout
performance
MobileCushion
quelle
quelle
Antworten:
Verschachtelte Gewichte sind schlecht für die Leistung, weil:
Es ist besser, RelativeLayouts zu verwenden und Ihre Ansicht an die Orte anderer Ansichten anzupassen, ohne bestimmte dpi-Werte zu verwenden.
quelle
Update: Wie wir wissen, ist die prozentuale Support-Bibliothek von API-Level 26 veraltet. Dies
ConstraintLayout
ist der neue Weg, um dieselbe flache XML-Struktur zu erreichen.Aktualisiertes Github-Projekt
Aktualisierte Beispiele:
Update: Gute Nachrichten Android Prozent Support-Bibliothek löst unser Problem der Leistung und verschachtelt chaotisch gewichtet
LinearLayout
Betrachten Sie dieses einfache Layout, um dasselbe zu demonstrieren.
Vermeideter Leistungsabbau mit Gewichten verschachtelt.
LinearLayout
Wirklich großartig !!!.quelle
Ich denke (und ich werde wahrscheinlich dafür geflammt sein), aber ich denke wieder, dass mein Telefon einen Quad-Core-Prozessor hat, der den meisten Heim-PCs der meisten Leute Konkurrenz macht (wenn nicht sogar völlig zerstört).
Ich denke auch, dass diese Art von Hardware-Fähigkeit die Zukunft von Telefonen ist.
Daher komme ich zu dem Schluss, dass es Ihrem Telefon weniger wichtig sein könnte, solange Sie nicht vom Verschachteln mitgerissen werden (in MHO sollte ein Layout niemals mehr als 4 Ebenen tief sein, und wenn Sie es wahrscheinlich falsch machen) über Gewichte haben.
Es gibt viele Dinge, die Sie tun können, die sich weitreichender auf die Leistung auswirken, als sich Sorgen zu machen, dass Ihr Prozessor zusätzliche Berechnungen durchführt.
(Bitte beachten Sie, dass ich ein wenig humorvoll bin und daher nichts zu ernst nehme, außer der Idee, dass es andere Dinge gibt, die Sie zuerst optimieren sollten, und dass die Sorge um ein 2-3-stufiges tiefes Gewicht nicht hilft Ihre Gesundheit)
quelle
Der Hauptgrund, warum verschachtelte Gewichte schlecht sind, ist, dass ein Layout, wenn es Kinder mit einem Gewicht hat, zweimal gemessen werden muss (ich denke, dies wird in der Flusenwarnung erwähnt). Dies bedeutet, dass ein gewichtetes Layout, das auch ein gewichtetes Layout enthält, viermal gemessen werden muss und jede 'Schicht' von Gewichten, die Sie hinzufügen, die Maße mit einer Zweierpotenz erhöht.
In ICS (API Level 14)
GridLayout
wurde das hinzugefügt, das einfache und "flache" Lösungen für viele Layouts ermöglicht, für die zuvor Gewichte erforderlich waren. Wenn Sie für frühere Versionen von Android entwickeln, fällt es Ihnen etwas schwerer, Gewichte zu entfernen. Wenn Sie jedoch einRelativeLayout
Layout verwenden und es so weit wie möglich reduzieren, entfernen Sie normalerweise viele der verschachtelten Gewichte.quelle
GridLayout
oder die gleichen Ergebnisse erzielen könnenRelativeLayout
. BeispielGridLayout
: "GridLayout bietet keine Unterstützung für das im Gewicht definierte Gewichtsprinzip. Im Allgemeinen ist es daher nicht möglich, ein GridLayout so zu konfigurieren, dass überschüssiger Speicherplatz auf mehrere Komponenten verteilt wird."Es gibt eine einfache Lösung, um verschachtelte LinearLayouts mit Gewichten zu vermeiden. Verwenden Sie einfach Tablelayout mit Gewichtssumme und verschachteltes LinearLayout mit weightSum. Tablelayout hat dieselben Attribute wie LinearLayout (Ausrichtung, Gewichtssumme, Layoutgewicht usw.) und zeigt keine Meldung an - "verschachtelte Gewichte schlecht für die Leistung haben "
Beispiel:
quelle
Ich denke, die einzige Alternative besteht darin, eine Funktion zu erstellen, die onResume heißt und alle Größen und Positionen festlegt. Wie auch immer, nach Gewicht können Sie nur Größen einstellen, aber keine Polster (damit Layouts noch komplizierter werden), keine Textgrößen (die irgendwie nicht kompensiert werden können), geschweige denn die Anzahl der Zeilen.
quelle