He escrito un par de archivos de diseño donde utilicé el layout_weight
atributo para crear una relación entre diferentes vistas.
En algún momento, empiezo a recibir advertencias de pelusa sobre pesos anidados.
Entonces, me pregunto por qué los pesos anidados son malos para el rendimiento, y si hay una forma más eficiente de crear una relación constante entre las dimensiones de la vista que podría usarse para diferentes tamaños de pantalla y que no necesita especificar muchos valores de ppp de dimensión a través de varios archivos de diseño (quiero decir, para diferentes tamaños de pantalla).
¡Gracias!
android
android-layout
performance
Cojín Móvil
fuente
fuente
Respuestas:
Los pesos anidados son malos para el rendimiento porque:
Es mejor usar RelativeLayout sy ajustar su vista de acuerdo con los lugares de otras vistas sin usar valores de dpi específicos.
fuente
Actualización: Como sabemos, el porcentaje de biblioteca de soporte está en desuso del nivel 26 de API.
ConstraintLayout
Es la nueva forma de lograr la misma estructura plana de XML.Proyecto Github actualizado
Muestras actualizadas:
Actualización: Buenas noticias, la biblioteca de soporte porcentual de Android resuelve nuestro problema de rendimiento y ponderado desordenado anidado
LinearLayout
Considere este diseño simple para demostrar lo mismo.
Degradador de rendimiento evitado anidado
LinearLayout
con pesas. ¡Realmente increíble!fuente
Creo (y probablemente se me criticará por esto), pero de nuevo creo que mi teléfono tiene un procesador de cuatro núcleos para rivalizar (si no destruir por completo) la mayoría de las PC hogareñas.
También creo que este tipo de capacidad de hardware es el futuro de los teléfonos.
Así que llegué a la conclusión de que, siempre y cuando no te dejes llevar por la anidación (en MHO un diseño nunca debe tener más de 4 niveles de profundidad, y si es así, probablemente lo estés haciendo mal), a tu teléfono podría importarle menos sobre tener pesas.
Hay muchas cosas que puede hacer que tendrán un efecto mucho más amplio en el rendimiento, y luego se preocuparán de que su procesador realice algunas operaciones matemáticas adicionales.
(tenga en cuenta que estoy siendo un poco humorístico, por lo que no me tome demasiado en serio esta publicación, aparte de la idea de que hay otras cosas que debe optimizar primero, y que preocuparse por un peso profundo de 2-3 niveles no está ayudando tu salud)
fuente
La razón principal por la cual los pesos anidados son malos es que cuando un diseño tiene hijos con un peso, debe medirse dos veces (creo que esto se menciona en la advertencia de pelusa). Esto significa que un diseño ponderado que también contiene un diseño ponderado tiene que medirse cuatro veces, y cada 'capa' de pesos que agrega aumenta las medidas con una potencia de dos.
En ICS (API nivel 14)
GridLayout
se agregó, lo que permite soluciones simples y 'planas' para muchos diseños que anteriormente requerían pesos. Si está desarrollando versiones anteriores de Android, le resultará un poco más difícil eliminar los pesos, pero usarRelativeLayout
y aplanar la mayor cantidad posible de su diseño en esa cabina generalmente elimina muchos de los pesos anidados.fuente
GridLayout
oRelativeLayout
. Por ejemplo, paraGridLayout
: "GridLayout no proporciona soporte para el principio de peso, como se define en peso. En general, por lo tanto, no es posible configurar un GridLayout para distribuir el espacio en exceso entre múltiples componentes".Hay una solución fácil para evitar LinearLayouts anidados con pesos: solo use Tablelayout con weightSum y LinearLayout anidado con weightSum: Tablelayout tiene los mismos atributos que LinearLayout (orientación, weightSum, layout_weight, etc.) y no muestra el mensaje "pesos anidados tener mal rendimiento "
Ejemplo:
fuente
Creo que la única alternativa es hacer una función que se llame onResume y establecerá todos los tamaños y posiciones. De todos modos, por peso, puede establecer solo tamaños pero sin relleno (por lo que los diseños se vuelven aún más complicados), sin tamaño de texto (imposible de compensar esto de alguna manera), y mucho menos cosas como el número de líneas.
fuente