2010-04-10 14 views

Respuesta

268

La manera más fácil es simplemente prestar atención al orden en que las Vistas se agregan a su archivo XML. Más abajo en el archivo significa más arriba en el eje Z.

Editar: Esto está documentado here y here en el sitio del desarrollador de Android. (Gracias @flightplanner)

+2

Gracias Steve H! ¿Está esta característica documentada en alguna parte? No me gustaría que mi diseño se rompa en una nueva versión de Android. – hpique

+0

Hmm, no estoy seguro. Voy a cavar más tarde para ver qué puedo encontrar. Sin embargo, el mismo principio se usa en otro lugar; lienzos (usados ​​para gráficos 2d) funcionan de la misma manera. Entonces sospecho que esto no cambiará. Aún así, es bueno verificarlo. –

+14

Desafortunadamente, esto no siempre es posible cambiar. Por ejemplo, en un diseño relativo, cada elemento solo se puede presentar con respecto a los definidos previamente en el archivo – Casebash

76

Si usted quiere hacer esto en código que puede hacer

View.bringToFront(); 

ver docs

13

me encontré con los mismos problemas: En un parentView disposición relativa, tengo 2 hijos childView1 y childView2. Al principio, puse childView1 sobre childView2 y quiero que childView1 esté encima de childView2. Cambiar el orden de las vistas de los niños no me solucionó el problema. Lo que funcionó para mí es establecer androide: clipChildren = "false" en parentView y en el código puse:

childView1.bringToFront(); 

parentView.invalidate(); 
+2

Esto está funcionando, y Android me pone muy triste. 'child.bringToFront()' con 'parent.invalidate()' funciona, pero 'parent.bringChildToFront (child)' no. ¿Dónde está la lógica que todos esperamos de un sistema operativo? –

+2

En un 'LinearLayout' se confunde la orden de los niños ... –

10

Tenga en cuenta que puede utilizar view.setZ(float) partir de API de nivel 21. Here usted puede encontrar más información

Pensamiento
+0

setz no está disponible debajo del nivel API 21. y bringtoFront() tiene un problema parpadeante. alguna idea para lograr lo mismo? –

8

me gustaría añadir una respuesta desde la introducción del androide

: Translationz

campo XML cambió las cosas un poco. Las otras respuestas que sugieren que ejecutan

childView1.bringToFront(); 

parentView.invalidate(); 

están totalmente en el clavo excepto por que este código no traerá childView1 delante de cualquier punto de vista con un androide codificado: Translationz en el archivo XML. Estaba teniendo problemas con esto, y una vez que eliminé este campo de las otras vistas, bringToFront() funcionó bien.

+0

esto también es cierto para 'elevation' de android 5 – shelll

1

Usted puede utilizar a medida RelativeLayout con redefinido

protected int getChildDrawingOrder (int childCount, int i)

Tenga en cuenta - este método toma como parámetro i "que debería llamar la vista i'th". Funciona así ViewPager. Establece el orden de dibujo personalizado en conjunción con PageTransformer.

2

childView.BringToFront() no funcionaba para mí, por lo que establece la traducción en Z del elemento menos recientemente agregado (la que fue la superposición de todos los otros niños) a un valor negativo de este modo:

lastView.setTranslationZ(-10);

ver https://developer.android.com/reference/android/view/View.html#setTranslationZ(float) para obtener más

+0

Gracias, esto me ayudó a dibujar una vista en la parte superior de la barra de navegación inferior nativa. Por alguna razón, la barra estaba en la cima de todo a pesar de su posición en el xml – Granjero

+0

Gracias, funciona solo para API 21 y superior. – noe

10

En Android a partir del API nivel 21, los elementos en el archivo de disposición obtienen su orden Z tanto de cómo se ordenan dentro del archivo, como se describe en la respuesta correcta, y de su elevación, un valor de elevación mayor significa el artículo obtiene un orden Z más alto.

Esto a veces puede causar problemas, especialmente con los botones que a menudo aparecen encima de los elementos que de acuerdo con el orden del XML deben estar debajo de ellos en orden Z. Para solucionar esto, simplemente configure android:elevation de los elementos en su diseño XML para que coincida con el orden Z que desea lograr.

I establece una elevación de un elemento en el diseño que comenzará a proyectar una sombra. Si no desea que este efecto se puede eliminar la sombra con el código de este modo:

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 diseño de XML.

32

Tenga en cuenta que los botones y otros elementos en API 21 y superior tienen una gran elevación y, por lo tanto, ignoran el orden xml de los elementos independientemente del diseño principal. Me tomó un tiempo resolver eso.

+5

Sí, realmente lo hace. Me tomó horas darme cuenta ... – aldok

+4

la solución a este error para mí fue llamar a setElevation (1000) en la vista que quiero que se represente sobre el botón. – Shaegorath

+0

Gracias. Me rasqué la cabeza por un momento antes de leer su respuesta, y luego entendí por qué se muestra un botón encima de una vista de anuncio añadida más tarde. – Hong

2

API 21 tiene view.setElevation(float) construir-en

Uso ViewCompat.setElevation(view, float); para la compatibilidad con versiones anteriores

Más métodos ViewCompat.setZ(v, pixels) y ViewCompat.setTranslationZ(v, pixels)

Antera manera recopilar botones o vista matriz y añadirlo al final

Cuestiones relacionadas