Es gibt eine Menge Fragen zu diesem Problem, aber die meisten sind zu spezialisiert, um meine Frage zu beantworten.
Ich habe ein GoogleMap
was ich sage, um seine Kamera an bestimmte Grenzen anzupassen. Vielleicht nicht sehr überraschend, bekomme ich einen Fehler:
java.lang.IllegalStateException: Map size should not be 0. Most likely, layout has not yet occured for the map view.
Lassen Sie uns also dieses Problem zu einem beliebigen View
abstrahieren.
Wann findet dieses Layout tatsächlich statt? onMeasure()
wird beispielsweise nicht im Aktivitätslebenszyklus angezeigt. Wann kann ich meine layoutbedürftige Methode aufrufen?
Um dieses Problem in der aktualisierten Google Maps-API zu lösen, sollten Sie
verwenden %Vor% Verwenden Sie ViewTreeObserver.OnGlobalLayoutListener
wie in Simons Antwort.
Sie können auch View.post()
verwenden, um der Nachrichtenwarteschlange View
etwas hinzuzufügen, aber ich weiß nicht, ob das Layout am Ende wirklich passiert ist (manche Leute sagen, dass es nicht passiert ist, aber dann Selbst Groupon + Google machen es falsch ).
Für ein Kartenfragment:
%Vor%Wie die Dokumentation sagt, sollten Sie dies verwenden
%Vor%Wo dies eine Aktivität ist, stattdessen
%Vor%Das funktioniert für mich.
Die Dokumentation
Hinweis: Verwenden Sie nur die einfachere Methode newLatLngBounds (boundary, padding) um ein CameraUpdate zu erzeugen, wenn es zum Verschieben des Kamera nachdem die Karte einem Layout unterzogen wurde. Während des Layouts die API berechnet die Anzeigegrenzen der Karte, die benötigt werden Projizieren Sie die Begrenzungsbox korrekt. Im Vergleich dazu können Sie die CameraUpdate zurückgegeben von der komplexeren Methode newLatLngBounds (Grenze, Breite, Höhe, Padding) zu jeder Zeit, auch bevor die Map einem Layout unterzogen wurde, weil die API das berechnet Zeige Grenzen von den übergebenen Argumenten an.
Ich denke, du meinst etwas, nachdem die Benutzeroberfläche angezeigt wird.
Die Verwendung eines globalen Layout-Listeners hat mir immer gut getan. Es hat auch den Vorteil, Dinge neu messen zu können, wenn das Layout geändert wird, z. Wenn etwas auf "View.GONE" eingestellt ist oder untergeordnete Ansichten hinzugefügt / entfernt werden.
%Vor%Ich würde onWindowFocusChanged (boolean) verwenden. Überprüfe einfach, ob das Fenster der Aktivität gerade den Fokus hat
%Vor%