Ich habe gerade eine Antwort für jemanden geschrieben, der von findViewById verwirrt war, und mir wurde klar, dass ich eine Lücke in meinem Verständnis habe. Diese Frage ist nur für Wissen und Neugier.
Bedenken Sie Folgendes:
%Vor% findViewById
gibt eine Instanz von View
zurück, die dann in die Zielklasse umgewandelt wird. Alles gut so weit.
Um die Ansicht einzurichten, erstellt findViewById
aus den Parametern in der zugehörigen XML-Deklaration ein AttributeSet
, das an den Konstruktor von View
übergeben wird.
Wir werfen dann die View
-Instanz auf Button
.
Wie wird der AttributeSet
wiederum an den Button
-Konstruktor übergeben?
[BEARBEITEN]
Also ich war der Verwirrte :). Der springende Punkt ist, dass, wenn das Layout aufgebläht ist, die View-Hierarchie bereits eine Instanz der View-Nachkommen-Klasse enthält. findViewById gibt einfach einen Verweis darauf zurück. Offensichtlich, wenn Sie darüber nachdenken - doh ..
findViewById
tut nichts. Sie durchsucht nur die Ansichtshierarchie und gibt den Verweis auf eine Ansicht mit der angeforderten viewId
zurück. View
ist bereits erstellt und existiert. Wenn Sie findViewById
für eine Ansicht nicht aufrufen, ändert sich nichts.
Die Aufrufe werden um LayoutInflator
erhöht. Wenn Sie setContentView
xml aufrufen, wird das Layout analysiert und die Ansichtshierarchie erstellt.
Attribute, die von LayoutInflater
an den Konstruktor von Button übergeben werden. Überprüfen Sie LayoutInflator-Quellcode .
Ich glaube nicht, dass findViewById()
eine Ansicht erstellt oder instanziiert. Es wird in der Ansichtshierarchie des bereits überhöhten Layouts nach einer Ansicht mit übereinstimmender ID gesucht. Diese Methode funktioniert bei View
und bei ViewGroup
unterschiedlich.
von Android Quellcode:
View.findViewById()
gibt das gleiche View-Objekt zurück, wenn diese View die angegebene ID oder null hat, und ruft auf:
ViewGroup.findViewById()
iteriert durch untergeordnete Ansichten und ruft die gleiche Methode für diese Ansichten auf, es ruft:
Tags und Links android