Ich habe Aktivität und viele Widgets drauf, einige von ihnen haben Animationen und aufgrund der Animationen bewegen sich einige der Widgets übereinander. Beispielsweise bewegt sich die Textansicht über einige Schaltflächen. . .
Jetzt möchte ich, dass die Tasten immer vorne sind. Und wenn sich die Textansicht bewegt, möchte ich mich hinter die Schaltflächen bewegen.
Ich kann das nicht erreichen. Ich habe alles versucht, was ich weiß, und "bringToFront ()" funktioniert definitiv nicht.
Hinweis Ich möchte die Z-Reihenfolge nicht durch die Reihenfolge der Platzierung des Elements im Layout steuern, da ich dies einfach nicht kann :), das Layout ist komplex und ich kann nicht alle Schaltflächen am Anfang des Layouts platzieren
RelativeLayout
mit der "Draufsicht" verwendet, die zuletzt im XML angezeigt wird. Siehe stackoverflow.com/a/31340762/1121497Antworten:
Sie können bringToFront () für die Ansicht aufrufen, die Sie vorne erhalten möchten
Dies ist ein Beispiel:
quelle
A / B / C
und wollte ichA
nach vorne bringen, also kama.bringToFront()
ich nach dem Laufen zu einem Layout wieB / C / A
.LinearLayout
nicht kann mit verwendet werdenbringToFront
. Am Ende habe ich einRelativeLayout
. Siehe meinen Kommentar zur Frage selbst.ViewCompat.setTranslationZ(view, 1)
funktioniert andererseits perfekt.Ich habe den Stapelüberlauf durchgesehen, um eine gute Antwort zu finden, und als ich keine finden konnte, habe ich die Dokumente durchgesehen.
Noch scheint niemand über diese einfache Antwort gestolpert zu sein:
Standardübersetzung z ist 0.0
quelle
setZ()
? Wenn ich mich richtig erinnere, ist die Z-Position der Ansicht schließlich ihre Höhe plus ihre Übersetzung Z.ViewCompat.setZ(view, yourValueInPixels);
view.setZ()
funktioniert dann nur auf API 21 und höher.Eine noch einfachere Lösung besteht darin, das XML der Aktivität zu bearbeiten. Verwenden
quelle
bringToFront()
Dies ist der richtige Weg. Beachten Sie jedoch, dass Sie die Methode auf höchster Ebene (unter Ihrer Stammansicht) aufrufenbringToFront()
undinvalidate()
methodisieren müssen , z.Die Hierarchie Ihrer Ansicht lautet:
Wenn Sie also Ihre Schaltflächen (1-> 6) wieder animieren, werden Ihre Schaltflächen unter (unter) dem angezeigt
ImageView
. Um es über (oben) zu bringen,ImageView
müssen Sie auf Ihrem s aufrufenbringToFront()
undinvalidate()
methodisierenLinearLayout
. Dann wird es funktionieren :) ** HINWEIS: Denken Sie daran,android:clipChildren="false"
für Ihr Root-Layout oder das gradparent_layout der Animationsansicht festzulegen. Werfen wir einen Blick auf meinen echten Code:.xml
Etwas Code in .java
Glück!
quelle
ConstraintLayout
, die a enthältRelativeLayout
, und eine andereRelativeLayout
, beide haben die gleiche Größe wie rootConstraintLayout
(match_parent
). Der ersteRelativeLayout
hat einButton
und liegt auch hinter dem zweiten (z-Reihenfolge)RelativeLayout
. Kann ich dasButton
im erstenRelativeLayout
so erscheinen lassen, als ob es über allem wäre, so dass es sichtbar und anklickbar istView::bringToFront()
?Mit diesem Code in XML
quelle
90dp
es?Versuchen Sie
FrameLayout
, es gibt Ihnen die Möglichkeit, Ansichten übereinander zu setzen. Sie können zwei erstellenLinearLayouts
: eine mit den Hintergrundansichten und eine mit Vordergrundansichten, und diese mit der kombinierenFrameLayout
. Hoffe das hilft.quelle
Wenn Sie verwenden
ConstraintLayout
, setzen Sie das Element einfach hinter die anderen Elemente, um es vor die anderen zu stellenquelle
Sie können versuchen, das zu verwenden
bringChildToFront
. Sie können überprüfen, ob diese Dokumentation auf der Seite für Android-Entwickler hilfreich ist .quelle
Es kann einen anderen Weg geben, der den Tag rettet. Initiieren Sie einfach einen neuen Dialog mit dem gewünschten Layout und zeigen Sie ihn einfach an. Ich brauche es, um eine Ladeansicht über ein DialogFragment anzuzeigen, und nur so war ich erfolgreich.
bringToFront () funktioniert in einigen Fällen wie meinem möglicherweise nicht. Der Inhalt des dialog_top-Layouts muss jedoch alles auf der UI-Ebene überschreiben. Dies ist jedoch eine hässliche Problemumgehung.
quelle
Ich habe das gleiche Problem konfrontiert. Die folgende Lösung hat bei mir funktioniert.
Die zweite Lösung besteht darin, xml zu verwenden und dieses Attribut der Ansicht xml hinzuzufügen
quelle
Sie können BindingAdapter folgendermaßen verwenden:
quelle
Sie müssen Framelayout verwenden. Und der bessere Weg, dies zu tun, besteht darin, die Ansicht unsichtbar zu machen, wenn sie nicht benötigt werden. Außerdem müssen Sie die Position für jede Ansicht festlegen, damit sie sich entsprechend der entsprechenden Position bewegen
quelle
Wenn Sie ein verwenden
LinearLayout
, sollten Sie anrufenmyView.bringToFront()
und danach anrufenparentView.requestLayout()
undparentView.invalidate()
den Elternteil zwingen, mit der neuen untergeordneten Reihenfolge neu zu zeichnen.quelle
Versuchen Sie, die Höhe darauf zu verwenden, so etwas wie
yourview.setElevation(5);
quelle
Dank des Stack- Benutzers über diese Erklärung funktioniert dies sogar unter Android 4.1.1
Bei meiner dynamischen Nutzung habe ich das zum Beispiel getan
Und Bamm!
quelle
Ordnen Sie sie in der Reihenfolge an, die Sie anzeigen möchten. Angenommen, Sie möchten Ansicht 1 über Ansicht 2 anzeigen. Schreiben Sie dann Code für Ansicht 2 und dann Code für Ansicht 1. Wenn Sie diese Bestellung nicht ausführen können, rufen Sie bringToFront () in der Stammansicht des Layouts auf, das Sie vorlegen möchten.
quelle
Sie können die Sichtbarkeit anderer Ansichten auf false setzen.
oder
und setzen
quelle