2011-12-08 12 views
5

Recibí un RelativeLayout en el que tengo controles en la parte superior. En tiempo de ejecución, quiero mostrar un MapView que acaba de agregarse al diseño, ocultando todas las demás vistas debajo de él, pero no los controles en la parte superior. Más tarde, MapView se oculta nuevamente.¿Por qué funciona view.bringToFront() doenst?

layout_main.bringChildToFront(layout_main.findViewWithTag("paramsUI")); 
layout_main.invalidate(); 

Parece que la cosa de findViewByTag funciona, lo he comprobado en modo de depuración. También probé:

layout_main.findViewWithTag("paramsUI").bringToFront(); 

que hay algo más que tengo que hacer?

Editar: Lo sentimos, el problema es que el MapView oculta la barra de control, que debe estar en la parte superior de todas las vistas, debido a la llamada a bringToFront().

+0

¿Cuál es el problema? Que el 'MapView' no desaparece? ¿O que los controles no están encima del 'MapView'? – kaspermoerch

Respuesta

0

Puede ajustar su RelativeLayout en LinearLayout y también colocar los controles en LinearLayout. De esta forma, hagas lo que hagas con RelativeLayout, los controles estarán bien.

+0

Esto parece descuidado, pero es la única solución que tengo que encontrar que funcione perfectamente. –

0

Es posible que desee considerar el uso de FrameLayout en lugar de RelativeLayout. Un RelativeLayout es más para vistas parciales, mientras que el FrameLayout está optimizado para aplicaciones de pantalla completa. De esta forma, puedes controlar dónde se dibujan los elementos.

Desde el FrameLayout documentation:

puntos de vista del niño se dibujan en una pila, con el niño más recientemente añadido en la parte superior. El tamaño de FrameLayout es el tamaño de su hijo más grande (más el relleno), visible o no (si el padre de FrameLayout lo permite). Las vistas que son GONE se utilizan para dimensionar solo si setConsiderGoneChildrenWhenMeasuring() se establece en verdadero.

Espero que esto ayude! Avísame si tienes más preguntas.

+2

¿Te importa compartir por qué bajaste tu voto? – Codeman

0

Para Android 4.x, es necesario llamar requestLayout() entre las dos llamadas:

layout_main.bringChildToFront(layout_main.findViewWithTag("paramsUI")); 
layout_main.requestLayout(); 
layout_main.invalidate(); 
0

Puede probar este código. Parece que funciona en versiones antiguas y nuevas de Android

if (android.os.Build.VERSION.SDK_INT >= 21) //Lollipop 
{ 
    view.setZ(5); 

    for (int i = 0; i < view.getParent().getChildCount(); i++) 
    { 
     if(view != view.getParent().getChildAt(i)) 
     { 
      view.getParent().getChildAt(i).setZ(4); 
     } 
    } 
} 

view.bringToFront(); 
for (int i = 0; i < view.getParent().getChildCount(); i++) 
{ 
    view.getParent().getChildAt(i).invalidate(); 
} 
view.getParent().requestLayout(); 
view.getParent().invalidate(); 
Cuestiones relacionadas