Definir el orden Z de las vistas de RelativeLayout en Android
Me gustaría definir el orden z de las vistas de un RelativeLayout en Android.
Sé que una forma de hacer esto es llamar bringToFront
.
¿Hay una mejor manera de hacer esto? Sería genial si pudiera definir el orden z en el xml de diseño.
11 answers
La forma más fácil es simplemente prestar atención al orden en el que se agregan las vistas a su archivo XML. Más abajo en el archivo significa más arriba en el eje Z.
Editar: Esto está documentado aquí y aquí en el sitio para desarrolladores de Android. (Gracias @ flightplanner)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-12 18:09:33
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-13 06:13:33
Tenga en cuenta que los botones y otros elementos de la API 21 y superiores tienen una elevación alta y, por lo tanto, ignoran el orden xml de los elementos independientemente del diseño principal. Me llevó un tiempo averiguarlo.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-19 12:13:51
Me encontré con los mismos problemas: En una disposición relativa parentView, tengo 2 hijos childView1 y childView2. Al principio, pongo childView1 encima de childView2 y quiero que childView1 esté encima de childView2. Cambiar el orden de las opiniones de los niños no resolvió el problema para mí. Lo que funcionó para mí es establecer android: clipChildren = "false" en parentView y en el código que establecí:
childView1.bringToFront();
parentView.invalidate();
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-01 09:08:54
En Android a partir del nivel de API 21, los elementos del archivo de diseño obtienen su orden Z tanto por la forma en que están ordenados dentro del archivo, como se describe en la respuesta correcta, como por su elevación, un valor de elevación más alto significa que el elemento obtiene un orden Z más alto.
Esto a veces puede causar problemas, especialmente con botones que a menudo aparecen encima de elementos que, de acuerdo con el orden del XML, deberían estar debajo de ellos en orden Z. Para arreglar esto, simplemente establezca el android:elevation
de los elementos en su diseño XML para que coincida con el orden Z que desea lograr.
Si establece una elevación de un elemento en el diseño, comenzará a proyectar una sombra. Si no desea este efecto, puede eliminar la sombra con un código como este:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
myView.setOutlineProvider(null);
}
No he encontrado ninguna manera de eliminar la sombra de una vista elevada a través del xml de diseño.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-24 14:55:55
Tenga en cuenta que puede usar view.setZ(float)
a partir del nivel de API 21. Aquí puede encontrar más información.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-17 15:59:55
Pensé en añadir una respuesta desde la introducción de la
Android: translationZ
El campo XML cambió un poco las cosas. Las otras respuestas que sugieren correr
childView1.bringToFront();
parentView.invalidate();
Son totalmente acertados, EXCEPTO que este código NO traerá childView1 frente a ninguna vista con un android:translationZ codificado en el archivo XML. Estaba teniendo problemas con esto, y una vez que eliminé este campo de las otras vistas, BringToFront() funcionó bien.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-20 18:08:36
ChildView.BringToFront () no funcionó para mí, así que establecí la traducción Z del elemento menos recientemente agregado (el que estaba superponiendo a todos los demás hijos) a un valor negativo como este:
lastView.setTranslationZ(-10);
Véase https://developer.android.com/reference/android/view/View.html#setTranslationZ (float) para más
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-17 00:30:33
API 21 tiene view.setElevation(float)
build-in
Use ViewCompat.setElevation(view, float);
para compatibilidad con versiones anteriores
Más métodos ViewCompat.setZ(v, pixels)
y ViewCompat.setTranslationZ(v, pixels)
Otra forma de recoger botones o ver matriz y añadirlo al final
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-02 10:44:18
Puede usar personalizado RelativeLayout
con redefinido
protected int getChildDrawingOrder (int childCount, int i)
Tenga en cuenta - este método toma param i
como "qué vista debo dibujar i'th
".
Así es como funciona ViewPager
. Establece el orden de dibujo personalizado en conjunción con PageTransformer
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-05 15:18:03
Compruebe si tiene alguna elevación en una de las vistas en XML. Si es así, agregue elevación al otro elemento o elimine la elevación para resolver el problema. A partir de ahí, es el orden de las vistas lo que dicta lo que viene por encima de la otra.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-03 08:30:27