2012-09-25 13 views
5

È possibile spostare gli elementi sopra altri elementi in Android in modo che NON influiscano sul layout del contenitore?Visualizzazioni mobili in modo che non occupino spazio nel layout

L'effetto che voglio raggiungere è un discorso-bolla-come elemento flottante:

enter image description here

La scatola gialla sopra è l'elemento che voglio galleggiare sopra gli altri elementi, ma come si può vederlo spingere il suo contenitore verso il basso creando lo spazio nero sotto la barra verde, invece di fluttuare sopra l'area grigia sottostante.

RelativeLayout può posizionare l'elemento in modo appropriato ma non riesco a trovare un modo per rendere l'elemento posizionato non espandere il limite del suo contenitore. È possibile anche su Android?


ANALOGIE

  • nel mondo web l'equivalente è un elemento che ha 'position: absolute' e non è quindi considerato come parte del "flusso" (cioè: layout)
  • nel mondo WPF l'equivalente sarebbe un elemento posizionato all'interno di una tela. La tela di canapa ha i suoi limiti, che occupano spazio nel layout, ma i suoi figli possono trovarsi al di fuori dei suoi limiti e non influenzare il layout
  • nel mondo iOS ogni vista è posizionato come una tela (dal momento che non ci sono gestori di layout) in modo questo comportamento è realizzato bysimply compensa x del telaio dell'elemento e y
+0

cosa intendi per "RelativeLayout può posizionare l'elemento in modo appropriato ma non riesco a trovare un modo per rendere l'elemento posizionato non espandere il limite del suo contenitore"? il contenitore è relativoLayout? – JRaymond

risposta

10

RelativeLayout può posizionare l'elemento appropriato ma non riesce a trovare un modo per rendere l'elemento posizionato si espande il confine del suo contenitore.

Quindi hai il contenitore sbagliato.

Ad esempio:

<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

Qui, il piccolo pulsante galleggia sopra la parte superiore del pulsante di grandi dimensioni. Il piccolo pulsante non "espande i confini del suo contenitore", semplicemente perché il contenitore è l'intera vista dei contenuti.

Si imposta il contenitore RelativeLayout (o FrameLayout) come quello che contiene l'area possibile su cui il bambino può galleggiare. Che sia l'intero schermo o solo un sottoinsieme, dipende da te. Al contrario, se il bambino sta interessando il confine del suo contenitore, che si sta utilizzando il contenitore sbagliato, o hai bisogno di creare un contenitore appositamente per questo ruolo.

In un altro esempio, Roman Nurik shows how to implement a floating "undo bar", simile a Gmail:

Floating Undo Bar

+1

Risposta stupenda! Sembra che la risposta sia no, Android non supporta il conteggio degli elementi come parte del layout). Quindi le soluzioni alternative sono 1) posizionare il contenitore RelativeLayout più in alto nella struttura dell'interfaccia utente in modo che i relativi limiti contengano tutto lo spazio necessario (ovvero tutti gli elementi dello schermo) o 2) avvolgere tutti gli elementi in un FrameLayout e utilizzare 'layout_gravity 'e margini per posizionare l'elemento (come nell'esempio Annulla che hai collegato sopra). Grazie per i pensieri! – Marchy

+0

@Marchy: "Android non supporta il conteggio degli elementi come parte del layout" - è corretto. – CommonsWare

1

Date un'occhiata a layout relativi in ​​Android: per esempio quando non specifichi una posizione in tutti i punti di vista all'interno del layout relativo galleggeranno l'uno sopra l'altro.

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

Esempio:

<?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> 

Edit: CommonsWare era più veloce;) dare un'occhiata alla sua bella risposta!

+1

+1 per aver menzionato che gli elementi in RelativeLayout saranno disposti l'uno sopra l'altro se non viene specificato alcun allineamento relativo – Marchy

Problemi correlati