Ich lerne über benutzerdefinierte Ansichten und wollte mehr über invalidate()
und requestLayout()
erfahren.Warum wird requestLayout direkt nach dem Ungültigmachen aufgerufen
Bitte auf diese Antwort und seine Diagramm:
invalidate()
Android sagt, dass der Zustand der Ansicht geändert wurde und neu gezeichnet werden.
requestLayout()
bedeutet, dass die Größe der Ansicht möglicherweise geändert wurde und erneut gemessen und dann neu gezeichnet werden muss.
invalidate()
ruft dispatchDraw()
, draw()
und onDraw()
auf, daher rendert es die Ansicht neu.
requestLayout()
auf der anderen Seite macht so ziemlich alles vom Messen bis zum erneuten Rendern.
Warum so viele der Beispiele da draußen (auch die TextView
Quellcode) rufen Sie invalidate()
und dann requestLayout()
direkt auf der nächsten Zeile?
Vielen Dank für die große Erklärung so entkräften() und requestLayout() aufgerufen zusammen, um unsere Sichtweise neu zu zeichnen und auch die Elterngruppe (die unsere Ansicht als Kind hat) sich anzupassen, ist gut für mögliche Größenänderungen unserer Sicht zu berücksichtigen, wenn wir wieder zeichnen –
Ich bin ein wenig unklar, wie warum würden Sie 'invalidate()' aufrufen, wenn Sie auch 'requestLayout()' aufrufen. Es scheint, als würde 'requestLayout()' immer dazu führen, dass Ihre gesamte Ansicht neu gezeichnet wird; Darüber hinaus erscheint der Aufruf von 'invalidate()' überflüssig. – pathfinderelite
@pathfinderelite Stellen Sie sich vor, wenn Sie ein lineares Layout haben, das den Inhalt umschließt, wird es nur so groß wie das, was innerhalb des linearen Layouts ist. Stellen Sie sich vor, ich hätte eine Textansicht. Wenn ich setText() aufruft, muss ich invalidate() aufrufen, um den neuen Text so darzustellen, dass er angezeigt wird. Jetzt könnte dieser Text das TextView größer machen, also muss ich requestLayout() aufrufen, um dem linearen Layout (dem Elternteil, das die Textansicht enthält) zu sagen, dass du die Größe ändern musst, damit du die TextView anpassen kannst, die jetzt mehr Text –