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

Je voudrais définir l’ordre z des vues d’un RelativeLayout dans Android.

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

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

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 développeur Android. (Merci @flightplanner)

Si vous voulez faire cela en code, vous pouvez le faire

 View.bringToFront(); 

voir docs

Veuillez noter que les boutons et les autres éléments de l’API 21 et les versions ultérieures présentent une élévation élevée et ignorent donc l’ordre xml des éléments, quelle que soit la présentation parente. Il m’a fallu du temps pour comprendre cela.

J’ai rencontré les mêmes problèmes: dans une mise en page parent parent, j’ai 2 enfants childView1 et childView2. Au début, j’ai placé childView1 au-dessus de childView2 et je veux que childView1 soit au dessus de childView2. Changer l’ordre des vues d’enfants n’a pas résolu le problème pour moi. 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(); 

Dans Android à partir du niveau 21 de l’API, les éléments du fichier de mise en page obtiennent leur ordre Z à la fois de leur ordre dans le fichier, comme indiqué dans la réponse correcte et de leur élévation, une valeur d’altitude plus élevée .

Cela peut parfois causer des problèmes, en particulier avec les boutons qui apparaissent souvent au-dessus des éléments qui, selon l’ordre du XML, devraient être en dessous d’eux dans l’ordre Z. Pour corriger cela, il suffit de définir l’ android:elevation des éléments de votre XML de mise en page pour correspondre à l’ordre Z que vous souhaitez atteindre.

Si vous définissez une élévation d’un élément dans la mise en page, il commencera à lancer une ombre. Si vous ne voulez pas cet effet, vous pouvez supprimer l’ombre avec du code comme ceci:

 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 élevée à travers le XML de mise en page.

Veuillez noter que vous pouvez utiliser view.setZ(float) partir du niveau 21 de l’API. Vous trouverez ici plus d’informations.

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

android: translationZ

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

 childView1.bringToFront(); parentView.invalidate(); 

sont totalement sur SAUF sauf que ce code ne va pas amener childView1 devant une vue avec un Android 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 très bien.

childView.bringToFront () ne fonctionnait pas pour moi, donc j’ai défini la traduction Z de l’élément le moins récemment ajouté (celui qui recouvrait tous les autres enfants) sur une valeur négative comme suit:

lastView.setTranslationZ(-10);

voir https://developer.android.com/reference/android/view/View.html#setTranslationZ(float) pour plus

API 21 a view.setElevation(float)

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

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

Autre façon, recueillez des boutons ou affichez le tableau et ajoutez-le à la fin

Vous pouvez utiliser un RelativeLayout personnalisé avec redéfini

protected int getChildDrawingOrder (int childCount, int i)

Sachez que cette méthode prend param i comme “quelle vue devrais-je dessiner”. Voici comment fonctionne ViewPager . Il définit l’ordre de dessin personnalisé en conjonction avec PageTransformer .

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