2010-04-13 10 views
16

Mam niestandardowy widok rozszerzający klasę Widok. Chciałbym 2 wystąpienia mojego niestandardowego widoku warstw bezpośrednio na siebie. Jak powinien wyglądać mój plik układu, aby to osiągnąć?Jak warstwować widoki

Odpowiedz

27

Okazało się, że FrameLayout było tym, czego chciałem. Po prostu zrób to w układzie:

<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

Dzięki mate. Oszalałem z tego powodu i wydaje mi się, że działa całkiem dobrze. Myślałem, że FrameLayout może mieć tylko jeden widoczny widok dziecka na raz ... Już próbowałem stworzyć własny układ i pomyślałem: musi być łatwiejszy sposób! P.S. Aha, a jeśli nie jest to oczywiste, widoki są domyślnie renderowane od góry do dołu, więc plansza 2 jest narysowana na planszy1. – Timo

+1

Bardzo ładne. Muszę powiedzieć, że nie podoba mi się to, jak często używane są układy względne i jestem szczęśliwy, że tego nie używa. (Krewni są po prostu niechlujni! Każdy pojedynczy obiekt musi mieć kilka atrybutów opisujących jego pozycję! Wydaje się, że to pokonuje cel używania układów ...) – ArtOfWarfare

24

Użyj RelativeLayout. Później dzieci z RelativeLayout będą nakładać się na wcześniejsze dzieci.

5

Choć to prawda, że ​​można osiągnąć za pomocą warstw RelativeLayout i FrameLayout, API 21 i wyżej .. wiele się zmieniło.

W interfejsie API 21 i nowszym późniejsze elementy podrzędne xml nie oznaczają, że będą się one nakładać na wcześniejsze dzieci. Zamiast tego używa Elevation, aby określić, który widok pokryje się z innym widokiem (indeks Z).

Na przykład, jeśli masz coś takiego.

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

View nie będzie widoczny, nawet jeśli został on dodany po Button. To dlatego, że Button ma wyższą wysokość niż View. Aby zmienić rozmieszczenie indeksu Z, możesz dodać atrybut elevation do odpowiednich widoków.

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

ten sposób View będzie pokrywać Button.

Więcej informacji na Podwyższenia & cieni: https://material.io/guidelines/material-design/elevation-shadows.html