2010-11-01 14 views
95

Siempre he estado usando RelativeLayout cada vez que necesitaba un contenedor View, debido a su flexibilidad, incluso si solo quería mostrar algo realmente simple.¿Es RelativeLayout más costoso que LinearLayout?

¿Está bien hacerlo, o debería intentar usar LinearLayout cuando puedo, desde el punto de vista de rendimiento/buenas prácticas?

Gracias!

Respuesta

124

En una charla en Google I/O 2013 (Escritura de vistas personalizadas para Android), Romain Guy aclaró el malentendido que hizo que todos comenzaran a usar RelativeLayouts para todo. Un RelativeLayout siempre tiene que hacer dos pasos de medida. En general, es insignificante siempre que su jerarquía de vistas sea simple. Pero si su jerarquía es compleja, hacer un pase de medida adicional podría ser bastante costoso. Además, si anida RelativeLayouts, obtendrá un algoritmo de medición exponencial.

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

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

+7

Sé que esta es una publicación anterior, pero ¿cuál consideraría la solución menos costosa al elegir entre una sola versión relativa y 2-3 lineales de salida? – Langkiller

+2

A ConstraintLayout :) – moyheen

50

A menos que esté diseñando muchas Vistas (por ejemplo, en un ListView), el rendimiento de elegir entre LinearLayout o RelativeLayout es insignificante. Elija el que sea más conveniente para el trabajo y preocúpese por el rendimiento solo cuando lo necesite.

Y aquí es lo que los documentos oficiales sobre Creating Efficient Layouts dice sobre el rendimiento de RelativeLayout y LinearLayout:

Cumplir con las características básicas es por desgracia no es el forma más eficiente para crear interfaces de usuario. Un ejemplo común de es el abuso de LinearLayout, que lleva a una proliferación de vistas en la jerarquía de vista . Cada vista, o peor, cada administrador de diseño, que agregue a su aplicación tiene un costo: la inicialización, el diseño y el dibujo se vuelven más lentos. El pase de disposición puede ser especialmente costoso cuando anota varios LinearLayout que usan el parámetro de peso , que requiere que el niño se mida dos veces.

+3

¿La justificación es insignificante? Encontré esto que dice que el tiempo relativo cuesta más justo como lo sospechaba https://bitbucket.org/spencerelliott/mercury/issue/1/changing-relativelayout-to-linearlayout – max4ever

+0

Simplemente evite agregar contenedores internos. –

-15

Usted puede intentar

<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> 

Usted encontrará que hay una gran cantidad de diferentes, si sus páginas Carga de algunas imágenes de Internet. En este caso, LinearLayout es 100% mejor que RelativeLayout.

2

Relativelayout es más efectivo que Linearlayout.

De here:

Es un error común que el uso de las estructuras básicas de diseño conduce a los diseños más eficientes. Sin embargo, cada widget y diseño que agregue a su aplicación requiere inicialización, diseño y dibujo. Por ejemplo, el uso de instancias anidadas de LinearLayout puede conducir a una jerarquía de vista excesivamente profunda. Además, anidar varias instancias de LinearLayout que usan el parámetro layout_weight puede ser especialmente costoso ya que cada niño debe medirse dos veces. Esto es particularmente importante cuando el diseño se infla repetidamente, como cuando se usa en un ListView o GridView.

+2

@phreakhead Tienes razón en que no hay una sola solución "correcta". Por eso, la solución "correcta" casi siempre es olvidarse por completo del rendimiento y hacer lo que sea más fácil de escribir y leer. –

+1

esa cita no respalda su afirmación, que solo es cierta en una situación –

Cuestiones relacionadas