73 votes

Pourquoi 0dp est-il considéré comme une amélioration des performances?

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

  1. android:layout_height
  2. android:layout_width
  3. android:layout_weight

Lorsqu'un LinearLayout est verticale, puis l' layout_weight l'effet de la hauteur de l'enfant, Views (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, Views (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 - Views ê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 ListViews, 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.

23voto

Prabuddha Points 37089

Tout d'abord, vous avez cela,

<ListView
    android:id="@android:id/list"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1">
</ListView>

Ne prenez jamais de la liste de hauteur wrap_content, qui va le conduire dans les ennuis. Here est la raison et de l' this answer.

De plus,

J'ai cherché mais n'ai rien trouvé qui explique pourquoi Android Peluches ainsi que certains Eclipse conseils suggère de remplacer certains layout_height et layout_width valeurs avec 0dp.

C'est parce que vous êtes à l'aide de layout_weight = "1" cela signifie que votre ListView avec prenez de la hauteur autant qu'il est disponible. Alors, dans ce cas il n'y a pas besoin de l'aide d' layout_height = "wrap_content" de passer à la android:layout_height="0dp" et de ListView hauteur sera géré par layout_weight = "1".

12voto

Archie.bpgc Points 8027

Alors, quand android:layout_weight est utilisé sur la Vue X et LinearLayout est horizontale, alors X android:layout_width est tout simplement ignoré.

Similaire, quand android:layout_weight est utilisé sur la Vue X et LinearLayout est verticale, alors X android:layout_height est ignoré.

Cela signifie, en réalité, que vous pouvez mettre n'importe quoi dans ces ignoré champs: 0dp ou fill_parent ou wrap_content. Il n'a pas d'importance. Mais il est recommandé d'utiliser 0dp donc de ne pas faire des calculs de leur hauteur ou de la largeur (qui est alors ignoré). Cette petite astuce gain de cycles CPU.

de :

Quel est le truc avec 0dip layout_height ou layouth_width?

5voto

android developer Points 20939

autant que je sache , il y a une différence entre l'utilisation de 0dp (ou 0px btw, c'est le même depuis 0 est 0 pour n'importe quelle unité ici ) et le wrap_content ou fill_parent (ou match_parent, c'est la même chose).

il dépend du poids que vous utilisez . si vous utilisez uniquement le poids de 1 , ils se ressemblent tous , mais le sens est toujours différent , et il est important pour les performances.

pour montrer cela , essayez les solutions suivantes:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
  android:layout_height="match_parent" android:orientation="vertical">

  <TextView android:id="@+id/textView1" android:layout_width="match_parent"
    android:layout_height="0px" android:text="1" android:background="#ffff0000"
    android:layout_weight="1" android:gravity="center"
    android:textColor="#ffffffff" android:textSize="20sp" />

  <TextView android:id="@+id/textView2" android:layout_width="match_parent"
    android:layout_height="0px" android:text="2" android:background="#ff00ff00"
    android:layout_weight="2" android:gravity="center"
    android:textColor="#ffffffff" android:textSize="20sp" />

  <TextView android:id="@+id/textView3" android:layout_width="match_parent"
    android:layout_height="0px" android:text="3" android:background="#ff0000ff"
    android:layout_weight="3" android:gravity="center"
    android:textColor="#ffffffff" android:textSize="20sp" />

</LinearLayout>

et puis, essayez de remplacer le 0px avec match_parent . vous verrez que le résultat est très différent.

généralement , pour une meilleure compréhension et de meilleures performances , vous pouvez utiliser 0px.

3voto

Karu Points 1065

LinearLayout des mesures de tous les enfants, en fonction de l' layout_width/layout_height valeurs, puis divise les restes de l'espace (qui peut être négatif) selon l' layout_weight valeurs.

0dp est plus efficace que l' wrap_content dans ce cas, car il est plus efficace d'utiliser le zéro pour la hauteur d'origine et de la diviser ensuite la mère de hauteur totale, sur la base du poids que de mesurer l'enfant d'abord, puis diviser le reste basé sur le poids.

Donc, l'efficacité vient pas de la mesure de l'enfant. 0dp doit être exactement aussi efficace (et produisent exactement le même résultat) match_parentou 42px, ou de tout autre numéro de fixe.

1voto

Damien Points 11

Attention utilisez android:layout_height="0dp"

J'ai trouvé que dans une ListView (recommandées par la Vue de recyclage à l'aide de convertView, voir par ex. http://lucasr.org/2012/04/05/performance-tips-for-androids-listview/), paramètre android:layout_height="0dp" pour la ligne TextView peut conduire à des textes tronqués de texte multi-ligne de contenu.

Chaque fois qu'un TextView objet qui a été précédemment utilisé pour afficher un texte qui, intégrés dans une seule ligne est recyclé pour afficher un texte plus long que les besoins de plus d'une ligne, le texte est tronqué à une seule ligne.

Le problème est guéri à l'aide d'android:layout_height="wrap_content"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X