J'ai une activité et beaucoup de widgets dessus, certains d'entre eux ont des animations et à cause des animations certains des widgets se déplacent (se traduisent) les uns sur les autres. Par exemple, la vue de texte se déplace sur certains boutons. . .
Maintenant, je veux que les boutons soient toujours sur le devant. Et lorsque la vue de texte se déplace, je veux me déplacer derrière les boutons.
Je ne peux pas y parvenir. J'ai essayé tout ce que je sais, et "bringToFront ()" ne fonctionne définitivement pas.
note Je ne veux pas contrôler l'ordre z par l'ordre de placement de l'élément dans la mise en page car je ne peux tout simplement pas :), la mise en page est complexe et je ne peux pas placer tous les boutons au début de la mise en page
RelativeLayout
avec la vue "de dessus" apparaissant en dernier dans le XML. Voir stackoverflow.com/a/31340762/1121497Réponses:
Vous pouvez appeler bringToFront () sur la vue que vous souhaitez obtenir au premier plan
Ceci est un exemple:
la source
A / B / C
et je voulais mettreA
au premier plan, donc après avoir couru,a.bringToFront()
j'ai fini avec une mise en page commeB / C / A
.LinearLayout
ne peut pas être utilisé avecbringToFront
. J'ai fini par utiliser un fichierRelativeLayout
. Voir mon commentaire sur la question elle-même.ViewCompat.setTranslationZ(view, 1)
fonctionne parfaitement par contre.J'ai cherché à travers le débordement de pile pour trouver une bonne réponse et quand je n'en trouvais pas une, j'ai parcouru la documentation.
personne ne semble encore être tombé sur cette réponse simple:
la traduction par défaut z est 0.0
la source
setZ()
? Si je me souviens bien, la position Z de la vue est son élévation plus sa translation Z, après tout.ViewCompat.setZ(view, yourValueInPixels);
view.setZ()
ne fonctionne alors que sur l'API 21 et supérieur.Une solution encore plus simple consiste à éditer le XML de l'activité. Utilisation
la source
bringToFront()
est la bonne façon, mais, notez que vous devez appelerbringToFront()
etinvalidate()
méthode sur la vue de plus haut niveau (sous votre vue racine), par exemple:La hiérarchie de votre vue est:
Ainsi, lorsque vous animez vos boutons (1-> 6), vos boutons seront sous (ci-dessous) le
ImageView
. Pour le faire passer (ci-dessus),ImageView
vous devez appelerbringToFront()
etinvalidate()
utiliser la méthode sur votreLinearLayout
s. Ensuite, cela fonctionnera :) ** REMARQUE: N'oubliez pas de définirandroid:clipChildren="false"
pour votre mise en page racine ou de gradparent_layout de la vue animée. Jetons un coup d'œil à mon vrai code:.xml
Un peu de code en .java
GLuck!
la source
ConstraintLayout
qui contient unRelativeLayout
, et un autreRelativeLayout
, les deux ont la même taille que sa racineConstraintLayout
(match_parent
). Le premierRelativeLayout
a unButton
, et est également derrière (dans l'ordre z) le secondRelativeLayout
. Puis-je faireButton
en sorte que le premierRelativeLayout
apparaisse comme s'il était au-dessus de tout, de sorte qu'il soit visible et cliquable, en utilisantView::bringToFront()
?Avec ce code en xml
la source
90dp
vient-il?Essayez
FrameLayout
, cela vous donne la possibilité de mettre les vues les unes au-dessus des autres. Vous pouvez en créer deuxLinearLayouts
: une avec les vues d'arrière-plan et une avec des vues de premier plan, et les combiner à l'aide deFrameLayout
. J'espère que cela t'aides.la source
Si vous utilisez
ConstraintLayout
, placez simplement l'élément après les autres éléments pour le faire à l'avant que les autresla source
Vous pouvez essayer d'utiliser le
bringChildToFront
, vous pouvez vérifier si cette documentation est utile dans la page Développeurs Android .la source
Il peut y avoir un autre moyen qui sauve la mise. Ouvrez simplement une nouvelle boîte de dialogue avec la mise en page souhaitée et montrez-la simplement. J'en ai besoin pour afficher un loadingView sur un DialogFragment et c'était la seule façon de réussir.
bringToFront () peut ne pas fonctionner dans certains cas comme le mien. Mais le contenu de la disposition dialog_top doit remplacer tout ce qui se trouve sur la couche d'interface utilisateur. Mais de toute façon, c'est une solution de contournement laide.
la source
j'ai fait face au même problème. la solution suivante a fonctionné pour moi.
La deuxième solution consiste à utiliser xml en ajoutant cet attribut à la vue xml
la source
Vous pouvez utiliser BindingAdapter comme ceci:
la source
Vous devez utiliser framelayout. Et la meilleure façon de faire est de rendre la vue invisible lorsque cela n'est pas nécessaire. Vous devez également définir la position pour chaque vue, afin qu'elles se déplacent en fonction de la position correspondante
la source
Si vous utilisez a,
LinearLayout
vous devez appelermyView.bringToFront()
et après, vous devez appelerparentView.requestLayout()
etparentView.invalidate()
forcer le parent à redessiner avec le nouvel ordre enfant.la source
Essayez d'utiliser l'élévation dessus, quelque chose comme
yourview.setElevation(5);
la source
Merci à l' utilisateur de Stack pour cette explication, cela fonctionne même sur Android 4.1.1
Sur mon utilisation dynamique, par exemple, j'ai fait
Et Bamm!
la source
Disposez-les dans l'ordre que vous souhaitez afficher. Supposons que vous vouliez afficher la vue 1 en haut de la vue 2. Ensuite, écrivez le code de la vue 2, puis écrivez le code de la vue 1. Si vous ne pouvez pas effectuer cet ordre, appelez bringToFront () à la vue racine de la mise en page que vous souhaitez mettre en avant.
la source
Vous pouvez définir la visibilité sur false pour les autres vues.
ou
Et mettre
la source