Je voudrais définir l'ordre z des vues d'un RelativeLayout dans Android.
Je sais qu'une façon de le faire est d'appeler bringToFront
.
Existe-t-il une meilleure façon de procéder? Ce serait génial si je pouvais définir l'ordre z dans la mise en page xml.
Réponses:
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.
Modifier: Ceci est documenté ici et ici sur le site des développeurs Android. (Merci @flightplanner)
la source
Si vous voulez le faire dans le code, vous pouvez le faire
voir les documents
la source
Veuillez noter que les boutons et autres éléments de l'API 21 et supérieur ont une élévation élevée et ignorent donc l'ordre xml des éléments, quelle que soit la disposition parent. Cela m'a pris un certain temps pour comprendre celui-là.
la source
Dans Android à partir du niveau 21 de l'API, les éléments du fichier de disposition obtiennent leur ordre Z à la fois de la façon dont ils sont ordonnés dans le fichier, comme décrit dans la bonne réponse, et de leur élévation, une valeur d'élévation plus élevée signifie que l'élément obtient un ordre Z plus élevé .
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, doivent être en dessous d'eux dans l'ordre Z. Pour résoudre ce problème, définissez simplement
android:elevation
les éléments de votre mise en page XML pour qu'ils correspondent à 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 à projeter une ombre. Si vous ne voulez pas de cet effet, vous pouvez supprimer l'ombre avec du code comme ceci:
Je n'ai trouvé aucun moyen de supprimer l'ombre d'une vue élevée à travers le xml de mise en page.
la source
android:elevation="1000dp"
. Aucune ombre n'est rendue de cette façon.J'ai rencontré les mêmes problèmes: dans un parentView de disposition relative, 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 n'a pas résolu le problème pour moi. Ce qui a fonctionné pour moi, c'est de définir android: clipChildren = "false" sur parentView et dans le code que j'ai défini:
la source
child.bringToFront()
avec desparent.invalidate()
œuvres, maisparent.bringChildToFront(child)
ne le fait pas. Où est la logique que nous attendons tous d'un OS?android:clipChildren="false"
fait l'affaire. Je vous remercie!S'il vous plaît noter que vous pouvez utiliser à
view.setZ(float)
partir du niveau de l' API 21. Ici , vous pouvez trouver plus d' informations.la source
J'ai pensé ajouter une réponse depuis l'introduction du
Le champ XML a changé les choses un peu. Les autres réponses qui suggèrent de courir
sont totalement parfaits SAUF que ce code ne mettra PAS childView1 devant aucune 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 () a très bien fonctionné.
la source
elevation
API 21 a
view.setElevation(float)
intégréUtiliser
ViewCompat.setElevation(view, float);
pour la compatibilité descendantePlus de méthodes
ViewCompat.setZ(v, pixels)
etViewCompat.setTranslationZ(v, pixels)
Une autre façon de collecter des boutons ou d'afficher un tableau et de l'utiliser
addView
pour ajouter à RelativeLayoutla source
childView.bringToFront () ne fonctionnait pas pour moi, j'ai donc 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
la source
Vous pouvez utiliser personnalisé
RelativeLayout
avec redéfiniprotected int getChildDrawingOrder (int childCount, int i)
Soyez conscient - cette méthode prend param
i
comme "quelle vue dois-je dessineri'th
". Voilà comment çaViewPager
marche. Il définit l'ordre de dessin personnalisé en conjonction avecPageTransformer
.la source
Vérifiez si vous avez une élévation sur l'une des vues en XML. Si tel 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.
la source
Ou placez le bouton ou les vues qui se chevauchent dans un FrameLayout. Ensuite, le RelativeLayout dans le fichier xml respectera l'ordre des dispositions enfants lors de leur ajout.
la source
Vous pouvez également utiliser l'exemple de code ci-dessous pour obtenir le même
Ceci est rétrocompatible. Voici
mCardView
une vue qui devrait être ci-dessoussourceView
.la source