2010-04-13 20 views
16

Ho una vista personalizzata che estende la classe View. Vorrei che 2 istanze della mia vista personalizzata fossero sovrapposte l'una sull'altra. Come dovrebbe apparire il mio file di layout per raggiungere questo obiettivo?Come sovrapporre viste

risposta

27

Risulta che FrameLayout era quello che volevo. Basta fare questo nel layout:

<FrameLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" > 

     <com.proj.MyView 
      android:id="@+id/board1" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content"/> 

     <com.proj.MyView 
      android:id="@+id/board2" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" /> 

    </FrameLayout> 
+2

Grazie amico. Stavo impazzendo per questo e sembra funzionare abbastanza bene. Pensavo che FrameLayout potesse contenere solo 1 vista figlio visibile alla volta ... Stavo già provando a creare il mio layout ed era come pensare: deve esserci un modo più semplice! P.S. Oh e nel caso non sia ovvio, le viste vengono visualizzate dall'alto verso il basso per impostazione predefinita in modo che board2 venga disegnata sulla parte superiore della scheda1. – Timo

+1

Molto bello. Devo dire che non mi piace quanto spesso vengano utilizzati i layout relativi e sono contento che questo non ne usi uno. (I parenti sono così disordinati! Ogni singolo oggetto deve avere alcuni attributi che descrivono la sua posizione! Sembra che questo sconfigga lo scopo di usare i layout ...) – ArtOfWarfare

24

Utilizzare un RelativeLayout. I bambini successivi di RelativeLayout si sovrappongono ai bambini precedenti.

5

Mentre è vero che si può ottenere utilizzando stratificazione RelativeLayout e FrameLayout, in API 21 e superiori .. le cose sono cambiate.

In API 21 e versioni successive, i figli successivi di xml non significano che si sovrapporranno ai bambini precedenti. Invece, utilizza Elevation per determinare quale vista si sovrapporrà ad un'altra vista (Z-Index).

Ad esempio, se si dispone di qualcosa di simile.

<FrameLayout 
    android:layout_height="match_parent" 
    android:layout_width="match_parent"> 

    <Button 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="@android:color/white" 
     android:text="Hello World" 
     android:layout_gravity="top" /> 

    <View 
     android:layout_width="match_parent" 
     android:layout_height="10dp" 
     android:background="@android:color/black" 
     android:layout_gravity="bottom" /> 

</FrameLayout> 

Il View non saranno visibili anche se è stato aggiunto dopo Button. Questo perché Button ha un'altitudine maggiore di View. Per riorganizzare Z-Index è possibile aggiungere l'attributo elevation alle rispettive viste.

<FrameLayout 
    android:layout_height="match_parent" 
    android:layout_width="match_parent"> 

    <Button 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="@android:color/white" 
     android:text="Hello World" 
     android:layout_gravity="top" 
     android:elevation="0dp" /> 

    <View 
     android:layout_width="match_parent" 
     android:layout_height="10dp" 
     android:background="@android:color/black" 
     android:layout_gravity="bottom" 
     android:elevation="2dp" /> 

</FrameLayout> 

In questo modo il View si sovrappongono l'Button.

Ulteriori informazioni sulla Elevation & Shadows: https://material.io/guidelines/material-design/elevation-shadows.html

Problemi correlati