2016-06-28 12 views
-1

Wer weiß, den Grund zu werfen beim Instanziieren einer Ansicht?Warum Casting zu instanziieren Ansichten in android

z.B .: TextView textView = (TextView) findViewById(R.id.textView);

+1

'findViewById()' instanziiert keine Ansicht. – CommonsWare

+0

Weil findViewById() eine Ansicht zurückgibt und diese Ansicht irgendeine Ansicht sein kann. –

+0

Ich hasse es zu sehen, wenn große Fragen zu SO downvoted, aber falsche Antworten auf diese Fragen werden stark upvoted. Ich verstehe, dass die Frage trivial erscheint, aber warum runtergeraten? – Vasiliy

Antwort

5

Das ist, weil alle Ansichten in android sind Subklassen von View Klasse und findViewById nichts über die Unterklasse kennen, zum Beispiel könnten Sie Ihre eigene benutzerdefinierte Ansicht haben. Es gibt keine Möglichkeit, dass Android Ihre Sichtklasse kennen würde. Daher gibt es nur die Oberklasse zurück und Sie müssten sie manuell in eine spezifischere Implementierung schreiben.

1

Der Grund für das Gießen ist, weil der Rückgabetyp der findViewById()-Funktion in Android View ist. Im Gegensatz zu dem, was @Bajji in seiner (derzeit akzeptierten) Antwort angegeben hat, hat eine Funktion einen Mittelwert über den Typ View, den Sie erwarten, um automatisches Casting für diese Klasse zu erhalten und auszuführen. Leider Android nicht über diese Funktionalität nutzen ...

Die folgende Funktion tut das:

protected <T extends View> T findViewById(@IdRes int id) { 
    return (T) getRootView().findViewById(id); 
} 

Wenn Sie diese Funktion definiert wäre, dann könnte man es auf diese Weise tun:

Sie können ein bisschen mehr Informationen in diesem blog post bekommen.

Verwandte Themen