para - manual de programacion android pdf
¿Cómo enviar una vista hacia atrás? ¿Cómo controlar el orden z programáticamente? (11)
Tengo un problema para enviar la vista hacia 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í, ¿alguien puede 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 programáticamente.
No quiero ocultar las vistas en el frente. Solo quiero que estén detrás de la vista que se mueve.
Afaik no hay una solución incorporada para esto. Supongo que estás tratando de modificar el orden z en 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 intercambie elementos secundarios, y eso modificaría el orden z. Parece una solución un poco hacky sin embargo.
O considere modificar la propiedad de visibilidad de las vistas secundarias, puede obtener un comportamiento similar, y eso sería mucho más limpio, creo.
Editar:
Con la nueva versión de Android, la L Developer Preview parece que por fin tenemos la capacidad de cambiar fácilmente el orden Z de Views. Propiedades ''Elevation'' y ''TranslationZ'' al rescate: https://developer.android.com/preview/material/views-shadows.html
Este es el método que estoy usando para enviar una Vista al reverso (tan opuesto a 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!
Llame a bringToFront()
en la vista que desea obtener en el frente, y luego llame al método invalidate()
en todas las vistas, incluida la vista que desee en la parte frontal. Repita lo mismo para todos los oyentes.
Entonces cuando se llamará al oyente de otra vista, la vista anterior quedará invalidada y estará en segundo plano.
Me doy cuenta de que esto ha sido implícito en otras respuestas, pero nadie publicó el código. Guardo lo siguiente en una clase de utilidad donde tengo funciones de "ayuda" para tratar 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 situada más abajo obtendrá casi el mismo efecto.
Podría intentar hacer view.setVisibility(View.INVISIBLE)
o view.setVisibility(View.GONE)
.
ACTUALIZAR:
This muestra cómo lograr lo que quiere hacer.
Si está utilizando la biblioteca de appCompat, hay otra forma de cambiar el orden Z para dispositivos de un nivel inferior a 21 API:
ViewCompat.setTranslationZ(view, zValue);
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.
Tenga en cuenta que puede usar view.setZ(float)
partir del API nivel 21. Here puede encontrar más información.
Yo fijaría su visibilidad a 0 o simplemente pondría la vista debajo de ella en frente de ella.
funciona bien, como bringToBack ()
public void moveToBack(ViewGroup viewGroup, View v) {
int s = 1;
for (int i = 1; i < viewGroup.getChildCount(); i++) {
if (viewGroup.getChildAt(1) == v) {
s = 2;
} else {
viewGroup.getChildAt(s).bringToFront();
}
}
}