Une réponse à la fin de cette question a été rempli, combinant observations et des solutions.
Question
J'ai cherché mais n'ai rien trouvé qui explique pourquoi Android Peluches ainsi que certains Eclipse conseils suggèrent de remplacer certains layout_height
et layout_width
valeurs 0dp
.
Par exemple, j'ai un ListView
qui a été proposé pour être changé
Avant
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1">
</ListView>
Après
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
</ListView>
De même, il a suggéré des modifications à un élément de liste. Ces tous le même aspect avant et après les changements, mais je suis intéressé à comprendre pourquoi ce sont les performances des boosters.
Quelqu'un a une explication de pourquoi? Si cela peut aider, voici la mise en page générale avec l' 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>
Réponse
Je suis en train de mettre dans une réponse ici, parce que c'est vraiment une combinaison de réponses et référencé liens ci-dessous. Si je me trompe sur quelque chose, faites-le moi savoir.
De qu'est-Ce que le truc avec 0dip layout_height ou layouth_width?
Il y a 3 présentation générale des attributs qui travaillent avec la largeur et la hauteur
android:layout_height
android:layout_width
android:layout_weight
Lorsqu'un LinearLayout
est verticale, puis l' layout_weight
l'effet de la hauteur de l'enfant, View
s (ListView
). Réglage de l' layout_height
de 0dp
sera la cause de cet attribut pour être ignoré.
Exemple
<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>
Lorsqu'un LinearLayout
est horizontale, puis l' layout_weight
sera en effet la largeur de l'enfant, View
s (ListView
). Réglage de l' layout_width
de 0dp
sera la cause de cet attribut pour être ignoré.
Exemple
<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>
La raison de vouloir ignorer l'attribut est que si vous n'avez pas l'ignorer, il serait utilisé pour calculer la mise en page qui utilise le plus de temps PROCESSEUR.
En outre, cela évite toute confusion quant à ce que la mise en page devrait ressembler lorsque vous utilisez une combinaison de ces trois attributs. Cela est souligné par @développeur android dans une réponse ci-dessous.
Aussi, Android Peluches et Éclipse les deux disent utiliser 0dip
. À partir de cette réponse, ci-dessous, vous pouvez utiliser 0dip
, 0dp
, 0px
, etc depuis une taille zéro est le même dans l'une des unités.
Éviter wrap_content sur ListView
De Layout_width d'une ListView
Si vous vous êtes jamais demandé pourquoi getView(...)
est appelé à maintes reprises, comme je l'ai, il s'avère être liés à l' wrap_content
.
À l'aide de wrap_content
comme j'ai été en utilisant ci-dessus entraînera tous les enfants - View
s être mesurée qui causera plus de temps PROCESSEUR. Cette mesure sera la cause de votre getView(...)
d'être appelé. J'ai maintenant testé cela et le nombre de fois getView(...)
est appelé est réduite considérablement.
Quand j'ai été en utilisant wrap_content
sur les deux ListView
s, getView(...)
a été appelé 3 fois pour chaque ligne sur un ListView
et 4 fois pour chaque ligne sur l'autre.
La modification de cette recommandées, 0dp
, getView(...)
a été appelé qu'une seule fois pour chaque ligne. C'est tout à fait une amélioration, mais qui a plus à voir avec évitant wrap_content
sur ListView
qu'il ne l' 0dp
.
Toutefois, la suggestion d' 0dp
améliore grandement la performance de ce fait.