Tengo actividad y muchos widgets, algunos de ellos tienen animaciones y, debido a las animaciones, algunos de los widgets se mueven (traducen) uno sobre otro. Por ejemplo, la vista de texto se mueve sobre algunos botones. . .
Ahora la cosa es que quiero que los botones estén siempre en el frente. Y cuando la vista de texto se mueve, quiero moverme detrás de los botones.
No puedo lograr esto. Probé todo lo que sé, y la definición definitiva de "bringToFront ()" no funciona.
tenga en cuenta que no quiero controlar el orden z por el orden de colocar el elemento en el diseño porque simplemente no puedo :), el diseño es complejo y no puedo colocar todos los botones al principio del diseño
RelativeLayout
con la vista "superior" que aparece en último lugar en el XML. Ver stackoverflow.com/a/31340762/1121497Respuestas:
Puede llamar a bringToFront () en la vista que desea ver al frente
Esto es un ejemplo:
fuente
A / B / C
y quería traerA
al frente, así que después de correra.bringToFront()
terminé con un diseño similarB / C / A
.LinearLayout
que no se puede usar conbringToFront
. Terminé usando aRelativeLayout
. Vea mi comentario sobre la pregunta en sí.ViewCompat.setTranslationZ(view, 1)
funciona perfectamente por otro lado.He estado buscando en el desbordamiento de la pila para encontrar una buena respuesta y cuando no pude encontrar una, busqué en los documentos.
Nadie parece haberse topado con esta simple respuesta todavía:
la traducción predeterminada z es 0.0
fuente
setZ()
? Si recuerdo correctamente, la posición Z de la vista es su elevación más su traducción Z, después de todo.ViewCompat.setZ(view, yourValueInPixels);
view.setZ()
solo funciona en API 21 y superior.Una solución aún más simple es editar el XML de la actividad. Utilizar
fuente
bringToFront()
es la forma correcta, pero, TENGA EN CUENTA que debe llamarbringToFront()
yinvalidate()
método en la vista de nivel más alto (debajo de su vista raíz), por ejemplo:La jerarquía de su vista es:
Entonces, cuando vuelvas a animar tus botones (1-> 6), tus botones estarán debajo (debajo) de
ImageView
. Para traerlo (arriba)ImageView
debe llamarbringToFront()
yinvalidate()
método en suLinearLayout
s. Entonces funcionará :) ** NOTA: Recuerde configurarandroid:clipChildren="false"
para su diseño de raíz o gradparent_layout de animate-view. Echemos un vistazo a mi código real:.xml
Algún código en .java
¡Qué suerte!
fuente
ConstraintLayout
que contiene unRelativeLayout
, y otroRelativeLayout
, ambos son del mismo tamaño que su raízConstraintLayout
(match_parent
). El primeroRelativeLayout
tiene unButton
, y también está detrás (en orden z) del segundoRelativeLayout
. ¿Puedo hacer que elButton
primeroRelativeLayout
aparezca como si estuviera encima de todo, de modo que sea visible y se pueda hacer clic en élView::bringToFront()
?Con este código en xml
fuente
90dp
vino?Intenta
FrameLayout
, te da la posibilidad de poner vistas una encima de otra. Puede crear dosLinearLayouts
: uno con las vistas de fondo y otro con vistas de primer plano, y combinarlos conFrameLayout
. Espero que esto ayude.fuente
Si está utilizando
ConstraintLayout
, simplemente coloque el elemento después de los otros elementos para que quede al frente de los demás.fuente
Puede intentar usar
bringChildToFront
, puede verificar si esta documentación es útil en la página de Desarrolladores de Android .fuente
Puede haber otra forma de salvar el día. Simplemente inicie un nuevo cuadro de diálogo con el diseño deseado y simplemente muéstrelo. Lo necesito para mostrar loadingView sobre un DialogFragment y esta fue la única forma en que tuve éxito.
bringToFront () podría no funcionar en algunos casos como el mío. Pero el contenido del diseño dialog_top debe anular cualquier cosa en la capa ui. Pero de todos modos, esta es una solución fea.
fuente
Me he enfrentado al mismo problema. La siguiente solución me ha funcionado.
La segunda solución es mediante el uso de xml agregando este atributo a la vista xml
fuente
Puede usar BindingAdapter así:
fuente
Necesitas usar framelayout. Y la mejor manera de hacer esto es hacer que la vista sea invisible cuando no se requiere. También debe establecer la posición para cada vista, para que se muevan de acuerdo con la posición correspondiente
fuente
Si está utilizando un
LinearLayout
, debe llamarmyView.bringToFront()
y después de llamarparentView.requestLayout()
yparentView.invalidate()
obligar al padre a volver a dibujar con el nuevo pedido hijo.fuente
Intenta usar la elevación en él, algo así como
yourview.setElevation(5);
fuente
Gracias al usuario de Stack por esta explicación, tengo esto funcionando incluso en Android 4.1.1
En mi uso dinámico, por ejemplo, hice
Y Bamm!
fuente
Organícelos en el orden que desea mostrar. Supongamos que desea mostrar la vista 1 encima de la vista 2. Luego escriba el código de la vista 2 y luego escriba el código de la vista 1. Si no puede hacer este pedido, llame a bringToFront () a la vista raíz del diseño que desea traer al frente.
fuente
Puede establecer la visibilidad en falso de otras vistas.
o
y establecer
fuente