264 votes

Placer/superposer (z-index) une vue au-dessus d'une autre vue dans Android

J'ai une mise en page linéaire qui consiste en une vue d'image et une vue de texte, l'une en dessous de l'autre dans une mise en page linéaire.

<LinearLayout android:orientation="horizontal" ... >
 <ImageView 
     android:id="@+id/thumbnail"
     android:layout_weight="0.8" 
     android:layout_width="0dip"
     android:layout_height="fill_parent">
 </ImageView>
 <TextView 
    android:id="@+id/description"
    android:layout_weight="0.2"
    android:layout_width="0dip"
    android:layout_height="wrap_content">
 </TextView>

Il se peut que certaines règles manquent, mais c'est pour donner une idée de ce à quoi ressemble la mise en page. Je veux une autre petite vue de texte de disons 50dip dans la longueur et la largeur, placée au-dessus de l'imageview, par "au-dessus" je veux dire z-index plus que l'imageview, je veux placer ceci, au centre et au-dessus (chevauchant) l'imageview.

Je voudrais savoir comment placer une vue au-dessus d'une autre, avec un z-index variable (de préférence en disposition linéaire) ?

319voto

kcoppock Points 57219

Vous ne pouvez pas utiliser un LinearLayout pour cela, mais vous pouvez utiliser un FrameLayout . Dans un FrameLayout le z-index est défini par l'ordre dans lequel les éléments sont ajoutés, par exemple :

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    >
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/my_drawable"
        android:scaleType="fitCenter"
        />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|center"
        android:padding="5dp"
        android:text="My Label"
        />
</FrameLayout>

Dans ce cas, le TextView sera dessiné au-dessus de l'ImageView, au centre de l'image.

0 votes

Oui, je l'ai fait en utilisant la mise en page du cadre lui-même après avoir parcouru la documentation. Merci.

11 votes

Y a-t-il un avantage à utiliser FrameLayout au lieu de RelativeLayout pour cela ?

13 votes

FrameLayout n'est pas lié aux autres vues du groupe, il les superpose simplement par rapport au parent. RelativeLayout sert plutôt à positionner les éléments par rapport aux autres.

201voto

diyism Points 1191

3 votes

Peut-on l'utiliser aussi dans les fichiers xml ?

2 votes

Je cherchais quelque chose de tel pour amener ma vue à changer son zindex pendant l'animation de la traduction.

0 votes

Pourriez-vous trouver une solution pour l'animation de la traduction ?

71voto

RedLenses Points 388

RelativeLayout fonctionne de la même manière, la dernière image de la disposition relative l'emporte.

14 votes

À moins que vous n'utilisiez l'élévation, vous avez alors besoin de la plus grande valeur dans ce cas.

5 votes

Cette question a été posée et répondue avant que l'élévation n'existe. L'utilisation de l'élévation ne résoudra pas le problème si votre application a un minSdk inférieur à Lollipop (sur les téléphones pré-lollipop, la mise en page aura l'air fausse si vous vous fiez uniquement à l'élévation) - vous devez toujours faire attention à l'ordre de la mise en page. Vous avez cependant raison de dire que si vous utilisez l'élévation sur le composant inférieur, vous devez absolument avoir au moins le même composant ou un composant supérieur sur le composant supérieur.

6voto

Tim Points 78

Il existe un moyen d'utiliser LinearLayout. Il suffit de définir la valeur marginTop de l'élément précédent sur la valeur négative correspondante, et de s'assurer que l'élément que vous souhaitez placer en haut se trouve après l'élément que vous souhaitez placer en bas dans votre XML.

<linearLayout android:orientation="horizontal" ... >
<ImageView 
 android:id="@+id/thumbnail"
 android:layout_weight="0.8" 
 android:layout_width="0dip"
 android:layout_height="fill_parent"
>
</ImageView>
<TextView 
android:id="@+id/description"
android:layout_marginTop="-20dip"
android:layout_weight="0.2"
android:layout_width="0dip"
android:layout_height="wrap_content"
>
</TextView>

4voto

MarvinLabs Points 13401

A priori, vous ne pouvez pas le faire avec des mises en page linéaires. RelativeLayout .

0 votes

RelativeLayout ne prolonge pas frameLayout, êtes-vous sûr que cela va fonctionner ?

0 votes

Il le fera. Vous pouvez utiliser un FrameLayout ou un RelativeLayout. Chacun d'entre eux a une façon différente de placer les vues enfant. Reportez-vous à la documentation pour en savoir plus sur ces layouts.

0 votes

C'est la voie à suivre

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X