Ich habe eine benutzerdefinierte Ansicht, die eine scrollbare Bitmap auf den Bildschirm zeichnet. Um es zu initialisieren, muss ich die Größe des übergeordneten Layoutobjekts in Pixel übergeben. Während der Funktionen onCreate und onResume wurde das Layout jedoch noch nicht gezeichnet, sodass layout.getMeasuredHeight () 0 zurückgibt.
Als Problemumgehung habe ich einen Handler hinzugefügt, der eine Sekunde wartet und dann misst. Das funktioniert, aber es ist schlampig, und ich habe keine Ahnung, wie viel ich die Zeit verkürzen kann, bevor ich am Ende bin, bevor das Layout gezeichnet wird.
Ich möchte wissen, wie ich erkennen kann, wann ein Layout gezeichnet wird. Gibt es ein Ereignis oder einen Rückruf?
quelle
view.post(Runnable)
, es ist sauberer und es macht das gleiche.Eine wirklich einfache Möglichkeit besteht darin, einfach
post()
Ihr Layout aufzurufen . Dadurch wird Ihr Code im nächsten Schritt ausgeführt, nachdem Ihre Ansicht bereits erstellt wurde.quelle
Um veralteten Code und Warnungen zu vermeiden, können Sie Folgendes verwenden:
quelle
Besser mit Kotlin-Erweiterungsfunktionen
quelle
Eine andere Antwort lautet:
Überprüfen Sie die Ansichtsabmessungen unter
onWindowFocusChanged
.quelle
Eine Alternative zu den üblichen Methoden besteht darin, sich in die Zeichnung der Ansicht einzuhängen.
OnPreDrawListener
wird beim Anzeigen einer Ansicht mehrmals aufgerufen, sodass es keine bestimmte Iteration gibt, bei der Ihre Ansicht eine gültige gemessene Breite oder Höhe hat. Dies erfordert, dass Sie kontinuierlich überprüfen (view.getMeasuredWidth() <= 0
) oder ein Limit für die Häufigkeit festlegen, mit der Sie nachmeasuredWidth
mehr als Null suchen.Es besteht auch die Möglichkeit, dass die Ansicht niemals gezeichnet wird, was auf andere Probleme mit Ihrem Code hinweisen kann.
quelle
How can you tell when a layout has been drawn?
und Sie werden , ein Verfahren , wo man ein AnrufOnPreDrawListener
unddon't stop interrogating that view until it has provided you with a reasonable answer
so die Einwände gegen Ihre Lösung sollte klar sein.Überprüfen Sie dies einfach, indem Sie die Post-Methode in Ihrem Layout oder Ihrer Ansicht aufrufen
quelle
post
stellt nur die ausführbare Datei in die Warteschlange, um sie auszuführen, stellt jedoch nicht sicher, dass die Ansicht gemessen wird, noch weniger gezeichnet.Wenn
onMeasure
die Ansicht aufgerufen wird, erhält sie die gemessene Breite / Höhe. Danach können Sie anrufenlayout.getMeasuredHeight()
.quelle