2013-02-10 12 views
8

Ich habe gerade eine Antwort für jemanden geschrieben, der von findViewById verwirrt wurde, und ich erkannte, dass ich eine Lücke in meinem Verständnis habe. Diese Frage ist nur für Wissen und Neugier.Wie findViewById eine Ansicht initialisiert

diese Bedenken Sie:

button = (Button)findViewById(R.id.button); 

findViewById gibt eine Instanz von View, die dann auf die Zielklasse umgewandelt wird. Alles gut bis jetzt.

Um die Ansicht einzurichten, erstellt findViewById einen AttributeSet aus den Parametern in der zugehörigen XML-Deklaration, die es an den Konstruktor View übergibt.

Wir werfen dann die View Instanz auf Button.

Wie wird der AttributeSet wiederum an den Button Konstruktor übergeben?

[EDIT]

So war ich verwirrt ein :). 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 ..

+0

+5 für die queston .... wegen Ihrer Frage habe ich recherchiert und finden Sie die vollständigen Informationen über die basi c Flow .... danke @Leonidos – Pragnani

Antwort

10

findViewById tut nichts. Sie durchsucht nur die Ansichtshierarchie und gibt den Verweis auf eine Ansicht mit der angeforderten Adresse viewId zurück. View ist bereits erstellt und existiert. Wenn Sie nicht für eine Ansicht findViewById aufrufen, ändert sich nichts.

Ansichten werden von LayoutInflator aufgeblasen. Wenn Sie setContentView aufrufen, wird das XML-Layout analysiert und die Ansichtshierarchie wird erstellt.

Attribute, die von LayoutInflater an Button's Konstruktor übergeben werden. Überprüfen Sie LayoutInflator source code.

+0

Ah, ich verstehe es. Sie meinen in der Ansichtshierarchie, dass die referenzierte Ansicht bereits instanziiert ist, indem der ctor der korrekten Nachkommenklasse aufgerufen wird? – Simon

+0

Attribute, die vom Layout-Inflater an den Konstruktor von Button übergeben werden. Überprüfen Sie [LayoutInflarot-Quellcode] (http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2_r1.1/android/view/LayoutInflater.java#LayoutInflater. inflate% 28org.xmlpull.v1.XmlPullParser% 2Candroid.view.ViewGroup% 2Cboolean% 29). – Leonidos

+0

Danke Leonidos. – Simon

5

Ich glaube nicht, findViewById() erstellt oder instanziiert eine Ansicht. Es wird in der Ansichtshierarchie des bereits überhöhten Layouts nach einer Ansicht mit übereinstimmender ID gesucht. Diese Methode funktioniert bei einem View und bei einem ViewGroup anders.

von Android Quellcode:

View.findViewById() gibt dasselbe View-Objekt, wenn diese Ansicht die angegebene ID oder null hat, ruft sie:

protected View findViewTraversal(int id) { 
    if (id == mID) { 
     return this; 
    } 
    return null; 
} 

iteriert durch Kind Ansichten und fordert gleiches Verfahren auf diesem Aufrufe, ruft es an:

+0

Was ist mId, wenn ich in der Ansicht Klasse mId zu No_ID..Wie hat es zuweisen mid der durchlaufenen Ansicht ID – Pragnani

+0

@Pragnani 'mId' ist die zugewiesene ID der Ansicht Wenn Sie in einer Ansicht 'setId (int id)' aufrufen, wird 'mID' auf den angegebenen int-Wert gesetzt. –

Verwandte Themen