237 votes

Définir 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 faire est d'appeler bringToFront .

Existe-t-il une meilleure façon de procéder ? Ce serait formidable si je pouvais définir l'ordre z dans le fichier xml de mise en page.

4 votes

View.bringToFront() ; est la réponse.

326voto

Steve Haley Points 26928

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

Modifier : Ceci est documenté ici et ici sur le site des développeurs Android. (Merci @flightplanner)

0 votes

Hmm, je ne suis pas sûr. Je vais creuser un peu plus tard pour voir ce que je peux trouver. Cependant, le même principe est utilisé ailleurs ; les toiles (utilisées pour les graphiques 2d) fonctionnent de la même manière. Je pense donc que cela ne changera pas. Néanmoins, c'est une bonne chose à vérifier.

16 votes

Il n'est malheureusement pas toujours possible de changer cela. Par exemple, dans une mise en page relative, chaque élément ne peut être mis en page que par rapport à ceux définis précédemment dans le fichier

69 votes

Casebash, je ne pense pas que ce soit nécessairement le cas, il faut juste utiliser le "@+id/your_element_before_its_defined" et ensuite utiliser le même id dans l'élément que vous définissez plus tard. Je peux me tromper, ces mises en page sont très délicates pour moi, mais j'ai bien l'impression que cela fonctionne.

91voto

QAMAR Points 619

Si vous voulez faire cela en code vous pouvez faire

View.bringToFront();

voir docs

77voto

Daniel Wilson Points 629

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

25voto

lejonl Points 228

Dans Android, à partir du niveau 21 de l'API, les éléments du fichier de mise en page obtiennent leur ordre Z à la fois à partir de la façon dont ils sont classés dans le fichier, comme décrit dans la réponse correcte, et à partir de leur élévation, une valeur d'élévation plus élevée signifiant que l'élément obtient un ordre Z plus élevé.

Cela peut parfois causer des problèmes, notamment avec les boutons qui apparaissent souvent au-dessus d'éléments qui, selon l'ordre du XML, devraient se trouver en dessous d'eux dans l'ordre Z. Pour résoudre ce problème, il suffit de définir le paramètre android:elevation des éléments de votre mise en page XML pour correspondre à l'ordre Z que vous souhaitez obtenir.

Si vous définissez l'élévation d'un élément dans la mise en page, il commencera à projeter une ombre. Si vous ne voulez pas de cet effet, vous pouvez supprimer l'ombre avec le code suivant :

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

Je n'ai pas trouvé de moyen de supprimer l'ombre d'une vue surélevée dans le fichier xml de mise en page.

16voto

Tony Vu Points 16

J'ai rencontré les mêmes problèmes : Dans un layout relatif parentView, 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 des enfants n'a pas résolu le problème pour moi. Ce qui a fonctionné pour moi est de définir Android:clipChildren="false" (en anglais) sur le parentView et dans le code j'ai mis :

childView1.bringToFront();

parentView.invalidate();

3 votes

Ça marche, et Android me rend si triste. child.bringToFront() avec parent.invalidate() fonctionne, mais parent.bringChildToFront(child) ne le fait pas. Où est la logique que nous attendons tous d'un système d'exploitation ?

0 votes

Afin d'animer certaines vues (translations en X et Y), j'ai essayé plusieurs combinaisons pour LinearLayout, FrameLayout et RelativeLayout mais il y avait toujours des problèmes (liés à des chevauchements ou des tailles non proportionnelles). Finalement android:clipChildren="false" a fait l'affaire. Merci !

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