Wie initialisiert findViewById eine Ansicht?

8

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 ..

    
Simon 10.02.2013, 18:22
quelle

2 Antworten

10

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 .

    
Leonidos 10.02.2013, 18:26
quelle
5

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:

%Vor%

ViewGroup.findViewById() iteriert durch untergeordnete Ansichten und ruft die gleiche Methode für diese Ansichten auf, es ruft:

%Vor%     
S.D. 10.02.2013 18:33
quelle

Tags und Links