Zu welcher Zeit im Anwendungslebenszyklus können / sollten Sie Layout-Messungen verwenden?

7

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?

    
Maarten 20.01.2013, 20:11
quelle

4 Antworten

9

BEARBEITEN:

Um dieses Problem in der aktualisierten Google Maps-API zu lösen, sollten Sie

verwenden %Vor%

Für jede andere Ansicht und ältere Maps-API

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%     
Maarten 20.01.2013, 20:47
quelle
16

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.

    
Francisco Hernandez 25.04.2013 09:52
quelle
2

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%

Ссылка

    
Simon 20.01.2013 20:13
quelle
1

Ich würde onWindowFocusChanged (boolean) verwenden. Überprüfe einfach, ob das Fenster der Aktivität gerade den Fokus hat

%Vor%     
Xavi Gil 20.01.2013 20:20
quelle

Tags und Links