left - ¿Es una mala práctica usar márgenes negativos en Android?
constraint layout add guideline (5)
Demostración de margen negativo:
El escenario
Superposición de vistas estableciendo un margen negativo en una de ellas para que invada el cuadro delimitador de otra vista.
Pensamientos
Parece que funciona de la forma esperada con la superposición de los diseños, si es que deberían. Pero no quiero encontrarme con un problema mayor porque sin saberlo no estoy haciendo las cosas bien. Emuladores, dispositivos físicos, lo que sea, cuando utiliza márgenes negativos, todo parece funcionar correctamente, una vista invade el cuadro delimitador de vistas de otra persona y, dependiendo de cómo se declare en el diseño, estará encima o debajo de la otra vista.
También soy consciente de que desde la API 21 podemos establecer los atributos translationZ
y translationZ para que la vista aparezca encima o debajo de otras vistas, pero mi preocupación básicamente proviene del hecho de que en la documentación de los atributos layout_margin
está claramente especificado que los valores de margen deben ser positivo , déjame citar:
Extracto:
Especifica espacio adicional en los lados izquierdo, superior, derecho e inferior de esta vista. Este espacio está fuera de los límites de esta vista. Los valores de margen deben ser positivos . Debe ser un valor de dimensión, que es un número de coma flotante con una unidad como "14.5sp". Las unidades disponibles son: px (píxeles), dp (píxeles independientes de la densidad), sp (píxeles escalados según el tamaño de fuente preferido), in (pulgadas), mm (milímetros) ...
En los años transcurridos desde que originalmente hice esta pregunta, no tuve ningún problema con los márgenes negativos, traté de evitar usarlos tanto como sea posible, pero no encontré ningún problema, por lo que, aunque la documentación lo dice, no soy demasiado preocupado por eso
En 2010, @RomainGuy (ingeniero principal de Android) declaró que los márgenes negativos tenían un comportamiento no especificado .
En 2011, @RomainGuy declaró que puede usar márgenes negativos en LinearLayout
y RelativeLayout
.
En 2016, @RomainGuy declaró que nunca recibieron soporte oficial y que no contarán con el respaldo de ConstraintLayout
.
Sin embargo, es fácil evitar esta limitación.
Agregue una vista de ayuda (altura 0dp, ancho limitado a principal) en la parte inferior de su vista base, en la parte inferior agregue el margen que desea.
A continuación, coloque su vista debajo de esta, lo que permite que tenga un margen "negativo", pero sin tener que utilizar ningún valor negativo no admitido.
En caso de que desee utilizar un margen negativo, establezca suficiente relleno para el contenedor y su clipToPadding en falso y establezca un margen negativo para sus elementos secundarios para que no recorte la vista secundaria.
Para mí, y con respecto a establecer un margen negativo en un TextView (me doy cuenta de que el OP se refiere a un ViewGroup, pero estaba buscando problemas con el establecimiento de márgenes negativos y aterricé aquí) ... encontré un problema con 4.0.3 ( API 15) SOLAMENTE y la configuración de android:layout_marginTop
o android:layout_marginBottom
a un valor negativo como -2dp.
Por alguna razón, TextView no se muestra en absoluto. Parece estar "fuera" de la vista (no solo invisible).
Cuando probé esto con las otras 3 versiones de layout_margin, no vi el problema.
Tenga en cuenta que no he probado esto en un dispositivo real, esto es usando un emulador 4.0.3. Esta es la segunda cosa extraña que encuentro que solo afectó a 4.0.3, así que mi nueva regla es probar siempre con un emulador 4.0.3 :)
Tengo éxito al reducir el margen inferior de un TextView usando android:lineSpacingExtra="-2dp"
que funciona aunque tengo android:singleLine="true"
(y entonces no pensé que el espaciado de línea sería un factor).
Podría haber sido una mala práctica en el pasado, pero con Material Design y sus botones de acción flotantes, parece ser inevitable y necesaria en muchos casos ahora. Básicamente, cuando tienes dos diseños separados que no puedes poner en un único RelativeLayout porque necesitan un manejo claramente separado (por ejemplo, el encabezado y el contenido de Thinking), la única forma de superponer el FAB es hacer que sobresalga uno diseños con márgenes negativos. Y esto crea problemas adicionales con áreas clicables.
Solo supe que fue posible por un período bastante corto de tiempo. Pero no veo ningún problema con eso. Solo tenga en cuenta los tamaños de pantalla y cosas por las que esté seguro de no hacer accidentalmente elementos que no deberían aparecer superpuestos en la pantalla. (es decir, el texto en la parte superior del texto probablemente sea una mala idea).