2010-04-13 12 views
16

J'ai une vue personnalisée qui étend la classe View. Je souhaite que deux instances de ma vue personnalisée soient superposées directement les unes au-dessus des autres. Comment mon fichier de mise en page devrait-il chercher à atteindre cet objectif?Comment superposer des vues

Répondre

27

Il s'avère que FrameLayout était ce que je voulais. Il suffit de le faire dans votre mise en page:

<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

Merci compagnon. Je devenais fou à ce sujet et cela semble très bien fonctionner. Je pensais que FrameLayout ne pouvait contenir qu'une vue enfant visible à la fois ... J'essayais déjà de créer ma propre mise en page et je pensais comme: il doit y avoir un moyen plus simple! P.S. Oh, et si ce n'est pas évident, les vues sont rendues de haut en bas par défaut, donc board2 est dessiné au dessus de board1. – Timo

+1

Très bien. Je dois dire, je n'aime pas la fréquence des mises en page et je suis heureux que celui-ci n'en utilise pas. (Les parents sont tellement en désordre! Chaque objet doit avoir quelques attributs décrivant sa position! Il semble que cela vienne à l'encontre de l'objectif d'utiliser des mises en page ...) – ArtOfWarfare

24

Utilisez un RelativeLayout. Plus tard les enfants du RelativeLayout chevaucheront les enfants plus tôt.

5

Il est vrai que vous pouvez réaliser en utilisant la superposition RelativeLayout et FrameLayout, dans l'API 21 et plus .. les choses ont changé.

Dans l'API 21 et les versions ultérieures, les enfants ultérieurs de xml ne signifient pas qu'il chevauchera les enfants plus tôt. Au lieu de cela, il utilise Elevation pour déterminer quelle vue chevauchera l'autre vue (Index Z).

Par exemple, si vous avez quelque chose comme ça.

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

Le View ne sera pas visible, même si elle a été ajoutée après Button. C'est parce que Button a une altitude plus élevée que View. Pour réorganiser l'index Z, vous pouvez ajouter l'attribut elevation aux vues respectives.

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

De cette façon, la View se chevaucher le Button.

Plus d'informations sur Elevation & Ombres: https://material.io/guidelines/material-design/elevation-shadows.html

Questions connexes