2012-09-25 17 views
5

¿Es posible hacer flotar elementos sobre otros elementos en Android para que NO afecten al diseño de su contenedor?Vistas flotantes para que no ocupen espacio en el diseño

El efecto que quiero lograr es un discurso-burbuja-como elemento flotante:

enter image description here

La caja amarilla de arriba es el elemento que quiero flotar por encima de los otros elementos, pero a medida que puede ver que empuja su contenedor hacia abajo creando el espacio negro debajo de la barra verde, en lugar de flotar sobre el área gris debajo de él.

RelativeLayout puede ubicar el elemento adecuadamente pero no puedo encontrar una manera de hacer que el elemento posicionado no expanda el límite de su contenedor. ¿Es esto posible en Android?


ANALOGÍAS

  • en el mundo web el equivalente es un elemento que tiene 'position: absolute' y por lo tanto no se cuenta como parte de la "flujo" (es decir: layout)
  • en el mundo de WPF el equivalente sería un elemento que se coloca dentro de un lienzo. El lienzo tiene sus propios límites que ocupan espacio en el diseño pero sus hijos pueden estar fuera de sus límites y no afectar el diseño
  • en el mundo iOS cada vista se coloca como un lienzo (ya que no hay administradores de diseño) este comportamiento se logra bysimply compensando x del marco de elemento e y
+0

¿qué quiere decir con "RelativeLayout puede ubicar el elemento adecuadamente pero no puedo encontrar una manera de hacer que el elemento posicionado no expanda el límite de su contenedor"? el contenedor es el relativo Layout? – JRaymond

Respuesta

10

RelativeLayout puede posicionar el elemento adecuadamente pero no puede encontrar una manera de hacer que el elemento de posicionado se expande el límite de su contenedor.

Luego tiene el contenedor equivocado.

Por ejemplo:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <Button 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:text="@string/big" 
     android:textSize="120dip" 
     android:textStyle="bold"/> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true" 
     android:text="@string/small"/> 

</RelativeLayout> 

Floating buttons

Aquí, los flotadores pequeños botones sobre la parte superior del botón grande. El botón pequeño no "expande el límite de su contenedor", simplemente porque el contenedor es la vista de contenido completa.

Configura el contenedor RelativeLayout (o FrameLayout) para que sea el que contenga la posible área sobre la que su niño pueda flotar. Si eso es la pantalla completa o simplemente un subconjunto depende de usted. Por el contrario, si su hijo está afectando el límite de su contenedor, está utilizando el contenedor equivocado o necesita configurar un contenedor específicamente para este rol.

En otro ejemplo, Roman Nurik shows how to implement a floating "undo bar", similar a Gmail de:

Floating Undo Bar

+1

¡Respuesta impresionante! Parece que la respuesta es no, Android no admite que no se cuenten los elementos como parte del diseño). Entonces las soluciones son 1) coloque el contenedor RelativeLayout más arriba en el árbol de UI para que sus límites contengan todo el espacio necesario (es decir: todos los elementos de la pantalla) o 2) ajuste todos los elementos en FrameLayout y use 'layout_gravity' 'y márgenes para posicionar el elemento (según el ejemplo de Deshacer al que se ha vinculado anteriormente). Gracias por los pensamientos! – Marchy

+0

@Marchy: "Android no admite no contar elementos como parte del diseño": eso es correcto. – CommonsWare

1

Tome un vistazo a los diseños relativos en android: por ejemplo, cuando usted no especificar una posición en todos los puntos de vista dentro de la disposición relativa flotarán uno encima del otro.

http://developer.android.com/guide/topics/ui/layout/relative.html

Ejemplo:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <TextView 
     android:id="@+id/update" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentTop="true" 
     android:background="#444444" 
     android:text="Update" 
     android:textAppearance="?android:attr/textAppearanceLarge" /> 


    <TextView 
     android:id="@+id/lost_of_text" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_above="@+id/some_button" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentTop="true" 
     android:text="text view with lots of text" 
     android:textAppearance="?android:attr/textAppearanceMedium" /> 

    <Button 
     android:id="@+id/some_button" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_centerHorizontal="true" 
     android:text="Some Button" /> 

</RelativeLayout> 

Editar: CommonsWare fue más rápido;) echar un vistazo a su hermosa respuesta!

+1

+1 por mencionar que los elementos en RelativeLayout se colocarán uno encima del otro si no se especifica una alineación relativa – Marchy

Cuestiones relacionadas