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.

Author: hpique, 2010-04-10

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)

 286
Author: Steve Haley,
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

Si quieres hacer esto en código usted puede hacer

View.bringToFront();

Véase documentos

 83
Author: QAMAR,
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.

 48
Author: Daniel Wilson,
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();
 13
Author: Tony Vu,
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.

 12
Author: lejonl,
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.

 11
Author: Vadim Kotov,
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.

 9
Author: ThePartyTurtle,
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

 3
Author: kip2,
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

 3
Author: Qamar,
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.

 1
Author: Petrov Dmitrii,
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.

 0
Author: The Fluffy T Rex,
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