Comment envoyer de la vue de dos ? Comment contrôler le z-commande par programme?
J'ai un problème pour envoyer la vue de dos. Dans Android, nous avons une méthode comme bringToFront()
, placer le point de vue sur le dessus de l'autre point de vue. Comme ça, je veux mettre la vue sur le dessous de l'image précédente.
Est il une méthode comme sendToBack()
ou bringToBack()
dans Android. Si oui, quelqu'un peut-il m'aider dans cette.
Remarque: notez que je ne veux pas de contrôle de la z-ordre de l'ordre de placer des objets dans la mise en page, je veux le contrôle de l'axe z de la programmation.
Je ne veux pas cacher les points de vue sur le front, je tiens simplement à être derrière le point de vue qui est en mouvement.
Vous devez vous connecter pour publier un commentaire.
Autant que je sache, il n'y a pas de solution pour cela. Je suppose que vous essayez de modifier l'ordre z dans un FrameLayout, ou quelque chose de similaire.
Cependant, je pense que vous pouvez modifier l'ordre des contenus les éléments enfants dans la mise en page. RemoveChild...() et addView() méthodes peuvent prendre les valeurs de position, de sorte que vous pourriez probablement swap éléments enfants autour, et qui permettrait de modifier l'ordre de superposition. Il semble un peu hacky solution cependant.
Ou envisager de modifier la visibilité des biens de l'enfant vues, vous pouvez obtenir le même comportement, et ce serait beaucoup plus propre je pense.
Edit:
Avec la nouvelle version d'Android, la L Developer Preview il semble que nous avons la capacité de changer facilement le Z commande de Vues. 'Élévation' et 'TranslationZ' propriétés à la rescousse: https://developer.android.com/preview/material/views-shadows.html
bringToFront()
pour unview
qui a des enfants. Vous devez d'abordremoveAllViews()
ousetVisibility(View.GONE)
ou somethingelse comme ça. Ensuite, vous pouvez utiliseraddView()
ousetVisibility(View.Visible)
pour réinsérer les enfants.Je me rends compte que cela a été impliqué dans d'autres réponses, mais personne n'a affiché le code. Je de rester dans une classe utilitaire où j'ai "helper" fonctions pour traiter les points de vue:
add()
dans unArrayList
). Vous pouvez l'essayer si vous le souhaitez. Ou de le confirmer en regardant le code source... il utilise addInArray() en interne. Mais vous avez raison au sujet de ce qui n'est pas clair dans la documentation. Et pour cette raison, si vous utilisez cette option, vous devriez probablement garder un œil sur à l'avenir de cette API mises à jour, juste au cas où ils décident de changer cela (sans-papiers) comportement. Bon point.parent
est unLinearLayout
,child
devient la première, quelle que soit la commande précédente; essayé sur de la Guimauve 6.0.1.Il n'y a pas de
sendToBack()
méthode. Mais si vous appelezbringToFront()
sur le bas placé de vue que vous obtenez à peu près le même effet.Appel
bringToFront()
sur la vue que vous souhaitez obtenir à l'avant, et ensuite appeler lainvalidate()
méthode sur l'ensemble de la vue, y compris la vue qui vous voulez à l'avant. Répétez les mêmes pour tous les auditeurs.Alors, quand un autre point de vue de l'auditeur seront appelés, à la vue précédente sera invalidé et sera en arrière-plan.
Voici la méthode que j'utilise pour envoyer une Vue de l'arrière (donc à l'opposé de bringToFront, sorte de sendToBack):
Espérons que cette aide!
Veuillez noter que vous pouvez utiliser
view.setZ(float)
à partir de l'API de niveau 21. Ici vous pouvez trouver plus d'info.il travail bien comme bringToBack()
Vous pouvez également essayer d'utiliser la fonctionnalité de
ViewGroup.addViewInLayout()
méthode qui prend un index, la détermination de l'opinion, à la fin ou au début de la listeDans votre Fichier XML, vous devez écrire dans l'ordre:
Dans ce cas, le
imageView
sera de retour de laFloatingActionButton
.Si vous voulez changer quelque chose, et vous allez le faire par programme ensuite:
Dans cet ordre d'affichage des déclarations, vous aurez de nouveau l'image du bouton flottant. Donc, la vue qui est déclarée première sera de retour à partir de la vue qui est déclarée d'autre part, et la clé de la réalisation de la commande, est de
removeAllViews
d'unFrameLayout
ouLinearLayout
et ajouter de nouveau de ce point de vue lorsque vous ajoutez un programme.Je voudrais soit ensemble de la visibilité à 0 ou simplement apporter le point de vue sous il en face de lui.
Si vous utilisez appCompat de la bibliothèque, il y a une autre façon de changer l'ordre Z pour les appareils inférieur à 21 niveau API:
Vous pourriez essayer de faire
view.setVisibility(View.INVISIBLE)
ouview.setVisibility(View.GONE)
.Mise à JOUR:
Cette vous montre comment réaliser ce que vous voulez faire.