Un RelativeLayout est-il plus cher qu'un LinearLayout?

114

J'ai toujours utilisé RelativeLayout chaque fois que j'avais besoin d'un conteneur View, en raison de sa flexibilité, même si je voulais juste afficher quelque chose de vraiment simple.

Est-ce correct de le faire, ou devrais-je essayer d'utiliser un LinearLayout quand je le peux, du point de vue des performances / bonnes pratiques?

Merci!

nbarraille
la source

Réponses:

149

Lors d'une conférence à Google I / O 2013 (Writing Custom Views for Android), Romain Guy a clarifié le malentendu qui a poussé tout le monde à utiliser RelativeLayouts pour tout. Un RelativeLayout doit toujours effectuer deux passes de mesure. Dans l'ensemble, il est négligeable tant que votre hiérarchie de vues est simple. Mais si votre hiérarchie est complexe, faire une passe de mesure supplémentaire pourrait s'avérer assez coûteux. De plus, si vous imbriquez des RelativeLayouts, vous obtenez un algorithme de mesure exponentiel.

https://www.youtube.com/watch?v=NYtB6mlu7vA&t=1m41s

https://www.youtube.com/watch?v=NYtB6mlu7vA&t=38m04s

Pierre-Antoine LaFayette
la source
8
Je sais que c'est un ancien article, mais que considérez-vous comme la solution la moins coûteuse lors du choix entre une seule mise en page relative et 2-3 mises en page linéaires?
Langkiller
5
A ConstraintLayout :)
moyheen
52

À moins que vous ne disposiez de nombreuses vues (par exemple dans une ListView), les performances du choix entre LinearLayout ou RelativeLayout sont négligeables. Choisissez celui qui est le plus pratique à utiliser pour le travail et ne vous souciez des performances que lorsque vous en avez besoin.

Et voici ce que la documentation officielle sur la création de mises en page efficaces dit sur les performances de RelativeLayout et LinearLayout:

S'en tenir aux fonctionnalités de base n'est malheureusement pas le moyen le plus efficace de créer des interfaces utilisateur. Un exemple courant est l'abus de LinearLayout, qui conduit à une prolifération de vues dans la hiérarchie des vues. Chaque vue - ou pire, chaque gestionnaire de mise en page - que vous ajoutez à votre application a un coût: l'initialisation, la mise en page et le dessin deviennent plus lents. La passe de mise en page peut être particulièrement coûteuse lorsque vous imbriquez plusieurs LinearLayout qui utilisent le paramètre de pondération, ce qui nécessite que l'enfant soit mesuré deux fois.

Mensonge Ryan
la source
3
la justification du fait qu'elle est négligeable? J'ai trouvé ceci qui indique que la mise en page relative coûte plus cher tout comme je soupçonnais bitbucket.org/spencerelliott/mercury/issue/1
...
Évitez simplement d'ajouter des conteneurs internes.
Luis Pena
2

Relativelayout est plus efficace que Linearlayout.

D' ici :

C'est une idée fausse courante que l'utilisation des structures de mise en page de base conduit aux mises en page les plus efficaces. Cependant, chaque widget et mise en page que vous ajoutez à votre application nécessite une initialisation, une mise en page et un dessin. Par exemple, l'utilisation d'instances imbriquées de LinearLayout peut conduire à une hiérarchie de vue trop profonde. De plus, l'imbrication de plusieurs instances de LinearLayout qui utilisent le paramètre layout_weight peut être particulièrement coûteuse car chaque enfant doit être mesuré deux fois. Ceci est particulièrement important lorsque la mise en page est gonflée à plusieurs reprises, par exemple lorsqu'elle est utilisée dans un ListView ou un GridView.

Nicholas Liu
la source
2
@phreakhead Vous avez raison de dire qu'il n'y a pas de solution "correcte" unique. C'est pourquoi la solution «correcte» est presque toujours d'oublier complètement les performances et de faire ce qui est le plus facile à écrire et à lire.
Kevin Krumwiede
3
cette citation ne confirme pas votre déclaration, ce qui n'est vrai que dans une situation
Flo We
La vérité est que vous concevez votre mise en page en essayant toujours de minimiser le nombre de niveaux de hiérarchie (mise en page à l'intérieur de la mise en page à l'intérieur de la mise en page) et vérifiez l'outil de visualisation de la hiérarchie pour trouver des problèmes potentiels.
Alexander Haroldo da Rocha
1

MISE À JOUR 2018: Dans la version N d'Android, la ConstraintLayoutclasse fournit des fonctionnalités similaires à RelativeLayout, mais à un coût nettement inférieur. C'est un gestionnaire de mise en page très puissant et il doit être utilisé chaque fois qu'il est nécessaire de créer une interface graphique complexe.

Akelec
la source
depuis la dernière version, il est devenu très très lent
Dragos Rachieru
Cela dépend de la manière dont il est utilisé. Vous devez éviter les contraintes de positionnement et d'utilisation absolues.
akelec
-25

Tu peux essayer

<LinearLayout>
       <ViewPager/><!--Loading images from net, it is very good as a testing case.-->
       <ViewPagerIndicator/>
       <TextView/> <!--Show some info about page-->
</LinearLayout>

<RelativeLayout>           
       <ViewPager/><!--Loading images from net, it is very good as a testing case.-->
       <ViewPagerIndicator below="id of ViewPager"/>
       <TextView below="id of ViewPagerIndicator"/> <!--Show some info about page-->
</RelativeLayout>

Vous constaterez qu'il y a beaucoup de choses différentes, si vos pages chargent des images à partir d'Internet. Dans ce cas, LinearLayout est 100% meilleur que RelativeLayout jamais.

TeeTracker
la source