web-dev-qa-db-fra.com

Définition de l'ordre Z des vues de RelativeLayout dans Android

Je voudrais définir l'ordre z des vues d'un RelativeLayout sous Android.

Je sais qu’une façon de procéder consiste à appeler bringToFront.

Y a-t-il une meilleure façon de faire cela? Ce serait formidable si je pouvais définir l’ordre z dans le layout XML.

205
hpique

Le moyen le plus simple consiste simplement à faire attention à l'ordre dans lequel les vues sont ajoutées à votre fichier XML. Plus bas dans le fichier signifie plus haut dans l'axe Z.

Edit: Ceci est documenté ici et ici sur le site du développeur Android. (Merci @flightplanner)

293
Steve Haley

Si vous voulez faire cela dans le codevous pouvez le faire 

View.bringToFront();

voir docs

84
QAMAR

Veuillez noter que les boutons et autres éléments d'API 21 et versions supérieures ont une élévation élevée et ignorent donc l'ordre des éléments XML, quelle que soit la disposition parent. Il m'a fallu un certain temps pour comprendre cela.

52
Daniel Wilson

J'ai rencontré les mêmes problèmes: Dans une mise en page relative parentView, j'ai 2 enfants childView1 et childView2. Au début, je mets childView1 au-dessus de childView2 et je veux que childView1 soit au-dessus de childView2. Changer l'ordre des vues des enfants ne m'a pas résolu le problème. Ce qui a fonctionné pour moi est de définir Android: clipChildren = "false" sur parentView et dans le code que j'ai défini:

childView1.bringToFront();

parentView.invalidate();
13
Tony Vu

Dans Android à partir de l'API de niveau 21, les éléments du fichier de mise en forme reçoivent leur ordre Z, de la manière dont ils sont ordonnés dans le fichier, comme indiqué dans la réponse correcte, et à partir de leur altitude, une valeur d'élévation supérieure signifie que l'élément reçoit un ordre Z supérieur . 

Cela peut parfois poser des problèmes, notamment avec les boutons qui apparaissent souvent au-dessus des éléments qui, selon l’ordre du XML, doivent être placés en dessous de ceux-ci, dans l’ordre Z. Pour résoudre ce problème, il suffit de définir le Android:elevation des éléments de votre mise en page XML afin qu'il corresponde à l'ordre Z que vous souhaitez obtenir.

Si vous définissez une élévation d'un élément dans la mise en page, elle commencera à projeter une ombre. Si vous ne voulez pas cet effet, vous pouvez supprimer l'ombre avec un code comme celui-ci: 

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
   myView.setOutlineProvider(null);
}

Je n'ai trouvé aucun moyen de supprimer l'ombre d'une vue surélevée par le biais de la mise en page XML.

13
lejonl

Veuillez noter que vous pouvez utiliser view.setZ(float) à partir de l’API niveau 21. Ici vous pouvez trouver plus d’informations.

12
Vadim Kotov

Je pensais ajouter une réponse depuis l’introduction du 

Android: translationZ

Le champ XML a changé un peu les choses. Les autres réponses qui suggèrent de courir

childView1.bringToFront();

parentView.invalidate();

sont totalement sur place SAUF pour que ce code n'apporte pas childView1 devant une vue avec un Android codé en dur: translationZ dans le fichier XML. J'avais des problèmes avec cela, et une fois que j'ai supprimé ce champ des autres vues, bringToFront () fonctionnait parfaitement.

11
ThePartyTurtle

L'API 21 a view.setElevation(float) intégré

Utilisez ViewCompat.setElevation(view, float); pour la compatibilité descendante

Plus de méthodes ViewCompat.setZ(v, pixels) et ViewCompat.setTranslationZ(v, pixels)

Une autre façon de collecter des boutons ou de voir un tableau et d’utiliser addView pour l’ajouter à RelativeLayout

5
Qamar

Vous pouvez utiliser la variable personnalisée RelativeLayout avec une définition redéfinie.

protected int getChildDrawingOrder (int childCount, int i)

Sachez que cette méthode utilise param i comme "la vue dans laquelle dois-je dessiner i'th" . C'est comment ViewPager fonctionne. Il définit l’ordre de dessin personnalisé en conjonction avec PageTransformer.

1
Petrov Dmitrii

Vérifiez si vous avez une élévation sur l’une des vues en XML. Si tel est le cas, ajoutez une élévation à l'autre élément ou supprimez l'élévation pour résoudre le problème. A partir de là, c'est l'ordre des vues qui dicte ce qui vient au-dessus de l'autre.

0

Vous pouvez également utiliser l'exemple de code ci-dessous pour obtenir le même résultat.

ViewCompat.setElevation(sourceView, ViewCompat.getElevation(mCardView)+1);

Ceci est rétro-compatible. Ici mCardView est une vue qui devrait être en dessous de sourceView.

0
Ankit

Ou placez le bouton ou les vues qui se chevauchent dans un FrameLayout. Ensuite, le RelativeLayout dans le fichier XML respectera l'ordre des mises en page enfants au fur et à mesure de l'ajout.

0
fullMoon