¿Cómo enviar la vista hacia atrás? ¿Cómo controlar la orden z de forma programática?

Tengo un problema para enviar la vista atrás. En Android tenemos un método como bringToFront() , para colocar la vista en la parte superior de la otra vista. Así, quiero poner la vista debajo de la imagen anterior.

¿Hay algún método como sendToBack() o bringToBack() en Android. Si es así, ¿puede alguien ayudarme en esto.

Nota: que no quiero controlar el orden z por el orden de colocar elementos en el diseño quiero controlar el orden z de forma programática.

No quiero ocultar las vistas en el frente, sólo quiero que estén detrás de la vista que se está moviendo.

Afaik no hay una solución integrada para esto. Supongo que estás tratando de modificar el orden z en un FrameLayout, o algo similar.

Sin embargo, creo que puede modificar el orden de los elementos secundarios contenidos en el diseño. Los métodos RemoveChild … () y addView () pueden tomar valores de posición, por lo que es muy probable que intercambien elementos secundarios alrededor, y eso modificaría el orden z. Parece un poco hacky solución sin embargo.

O considerar la modificación de la propiedad de visibilidad de las vistas de los niños, puede obtener un comportamiento similar, y que sería mucho más limpio, creo.

Editar:

Con la nueva versión de Android, L Developer Preview, parece que al fin tenemos la capacidad de cambiar fácilmente la ordenación Z de Views. Propiedades 'Elevation' y 'TranslationZ' al rescate: https://developer.android.com/preview/material/views-shadows.html

Me doy cuenta de que esto ha sido implícito en otras respuestas, pero nadie publicó el código. Tengo lo siguiente en una clase de utilidad en la que tengo funciones "auxiliares" para tratar con las vistas:

 public static void sendViewToBack(final View child) { final ViewGroup parent = (ViewGroup)child.getParent(); if (null != parent) { parent.removeView(child); parent.addView(child, 0); } } 

No hay método sendToBack (). Pero si llama a bringToFront () en la vista inferior, obtendrá prácticamente el mismo efecto.

Llame a bringToFront() en la vista que desee obtener en la parte frontal y, a continuación, llame al método invalidate() en toda la vista, incluida la vista que desee en la parte frontal. Repita lo mismo para todos los oyentes.

Por lo tanto, cuando se escucha a otro usuario de la vista, la vista anterior se invalidará y estará en segundo plano.

Aquí está el método que estoy usando para enviar una vista a la parte posterior (tan opuesto de bringToFront, tipo de sendToBack):

  private void moveToBack(View myCurrentView) { ViewGroup myViewGroup = ((ViewGroup) myCurrentView.getParent()); int index = myViewGroup.indexOfChild(myCurrentView); for(int i = 0; i<index; i++) { myViewGroup.bringChildToFront(myViewGroup.getChildAt(i)); } } 

¡Espero que esto ayude!

También puede intentar utilizar la funcionalidad del método ViewGroup.addViewInLayout() que toma un índice, determinando si la vista debe estar al final o al principio de la lista

Puede intentar hacer view.setVisibility(View.INVISIBLE) o view.setVisibility(View.GONE) .

ACTUALIZAR:

Esto le muestra cómo lograr lo que desea hacer.

O bien poner su visibilidad a 0 o simplemente llevar la vista debajo de ella en frente de ella.

Tenga en cuenta que puede utilizar view.setZ(float) desde el nivel API 21. Aquí puede encontrar más información.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.