android - studio - linearlayout z index
Ver traer al frente no funciona (5)
Quiero cambiar el orden z de algunas vistas durante la animación
En Androids por encima de 4.1.2 funciona bien, y en androides por debajo de 4.1.2 el orden Z no cambia, la vista superior permanece en la parte superior.
Esto es lo que estoy tratando.
myView.bringToFront();
((View)myView.getParent()).invalidate();
¿Cómo hacer que funcione en dispositivos más antiguos?
Espero que esto sea de utilidad para alguien. Ninguna de las soluciones anteriores funcionó para mí. ¿Por qué? Porque mi opinión de que quería estar en la fronda tenía una elevación más pequeña que otra vista. Así que la vista con mayor elevación siempre estaba en frente, sin importar qué.
Intenté todo eso. Se suponía que un RelativeLayout estaba encima de un Button, pero simplemente no quería obedecer.
Al final lo resolví agregando android:elevation="2dp"
al RelativeLayout.
El valor de elevación solo se utiliza en el nivel API 21 y superior. En mi caso, todo lo que estaba por debajo del nivel 21 de API estaba bien y todo lo anterior no lo estaba.
Espero que esto pueda ayudar a alguien :)
Para Api 21 o superior Hay un atributo xml conocido como translateZ
que le permite definir el nivel de elevación en la vista.
Usted puede usar mucho eso también.
Android: translateZ = "30dp"
* APIs> = 21
Si la vista principal es una distribución relativa, entonces podría funcionar o podría no funcionar. Intenté bringToFront
, requestLayout
y removeView; addView
removeView; addView
, pero no hay suerte. Mi solución fue poner todo dentro de un framelayout. Lo que necesitaba en la parte superior era mover el botón de framelayout con visibilidad invisible, y luego en el código se hizo visible.
/**
* Change the view''s z order in the tree, so it''s on top of other sibling
* views. This ordering change may affect layout, if the parent container
* uses an order-dependent layout scheme (e.g., LinearLayout). Prior
* to {@link android.os.Build.VERSION_CODES#KITKAT} this
* method should be followed by calls to {@link #requestLayout()} and
* {@link View#invalidate()} on the view''s parent to force the parent to redraw
* with the new child ordering.
*
* @see ViewGroup#bringChildToFront(View)
*/
public void bringToFront() {
if (mParent != null) {
mParent.bringChildToFront(this);
}
}
De acuerdo con esto simplemente me faltaba la línea
((View)myView.getParent()).requestLayout();
¡Y funcionó!