Was löst den Aufruf eines measure () der View aus?
In meiner Anwendung habe ich eine Endlosschleife auf einem meiner Ansicht onMeasure() überschreibt. Debuggen des Quellcodes ausgehend von einem break-point in meinem onMeasure, ich bin in der Lage zu verfolgen mich den ganzen Weg bis der stack-trace bis zu den PhoneWindow$DecorView die measure () - (oberste Klasse in meinem View Hierarchy), die aufgerufen wird, durch ViewRoot.performTraversals(). Jetzt von hier aus, wenn ich halten, treten über, ich schließlich die PhoneWindow$DecorView s measure() wieder aufgerufen, indem eine Nachricht in den Looper.loop () - Klasse. Ich vermute etwas in der Warteschlange, eine Nachricht, die es braucht, um nachmessen, wie eine ungültig.
Meine Frage ist, was löst eine Maßnahme nennen, muss auftreten, auf einen Blick?
Aus meinem Verständnis für das layout/Messen/draw-Verfahren, dies wird nur auftreten, wenn die invalidate () - Methode wird aufgerufen, auf eine bestimmte Sicht, und das wird die trickle-down und durchführen eines layout/Messen/zeichnen-pass für diese Ansicht für ungültig erklärt und alle seine Kinder. Ich würde davon ausgehen, dass irgendwie meine oberste View-aus meiner Sicht-Hierarchie ist immer ungültig.
Allerdings habe ich explizit setzen Sie einen break-Punkt auf jedes einzelne invalidate-Aufruf habe ich, und bin kein Aufruf von invalidate in einigen unendliche Weise. Also ich glaube nicht, dass das der Fall ist. Gibt es eine andere Möglichkeit zum auslösen einer Messung bestehen? Könnte etwas intern auslösen? Ich bin Art von Ideen nach sehen, dass nichts unendlich ungültig.
InformationsquelleAutor der Frage C Nick | 2011-08-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Auszulösen ein Maß pass für eine benutzerdefinierte Ansicht, die Sie aufrufen müssen, die requestLayout () - Methode.
Zum Beispiel, wenn Sie implementieren eine benutzerdefinierte Ansicht, erweitert die Sicht und er wird sich Verhalten wie ein TextView, könnten Sie schreiben, eine setText Methode wie diese:
InformationsquelleAutor der Antwort moondroid
Gut, Wenn Sie ändern eine Ansicht von Inhalten, wird es schließlich haben, rufen invalidate(). Zum Beispiel, Sie haben eine TextView mit einem text mit der Bezeichnung "Text 1". Nun, ändern Sie den text von der gleichen TextView "Text 2". Hier auch, invalidate aufgerufen wird.
Also im Grunde, wenn sich etwas ändert auf der Ansicht, mehr als oft nicht, würden Sie erwarten, dass die Methode invalidate aufgerufen werden, und einen entsprechenden Aufruf der measure().
Blick auf den Quellcode für TextView, zum Beispiel.
http://www.google.com/codesearch#uX1GffpyOZk/core/java/android/widget/TextView.java&q=TextView%20package:android&type=cs
Zählen Sie die Anzahl der invalidate-Aufrufe. Es gibt durchaus ein paar.
InformationsquelleAutor der Antwort Kumar Bibek