TextView Cast?

  • 4 Antworten
  • Letztes Antwortdatum
B

bandchef

Neues Mitglied
0
Hi Leute!

Nehmen wir mal an, ich habe in einer Activity eine View (TextView) erstellt in der XML-Datei die id "tv_title" trägt . Nun möchte ich in der Main.java auf diese TextView zugreifen, deklariere ich diese TextView in der onCreate-Methode, nämlich so:

Code:
TextView tv_title = (TextView) findViewById(R.Id.tv_title);

WARUM muss man dennoch den expliziten TypeCaste (TextView) mit hinschreiben? Ich mein warum nach TextView casten, wenn der Datentyp ein paar Zeichen vorher genau der selbe ist?
 
ich denke mal das ist so, weil java das so verlangt.
 
Weil die Funktion findViewById immer Werte der Klasse View zurück gibt und nicht TextView, Button oder was auch immer.

Activity | Android Developers
 
Wie reneph schon schrieb, liefert 'findViewById()' halt einen View zurück.
Das kann eben auch ein Button, EditText, Spinner oder sonst was sein.

Die Alternative wären sonst wohl explizite Methoden für jeden Viewtyp.

Wenn's dich wirklich nervt und du häufig findViewById() für TextViews nutzt könntest Du dir auch eine eigene Methode dafür basteln.

Sowas wie:
Code:
private TextView findTextViewById(int id){
 return (TextView) findViewById(id);
}
 
Falls es dich noch genauer interessiert:

Es wird unterschieden zwischen Upcasting und Downcasting.

Bei einem Upcast ist kein expliziter Cast nötig
Bei einem Downcast ist ein expliziter Cast zwingend

Am besten vorstellen kann man sich das, wenn man die Klassenhierarchie eines Elements anschaut. Bei der TextView sieht die Hierarchie so aus:

java.lang.Object
- android.view.View
- - android.widget.TextView

Es handelt sich um einen Upcast, wenn man eine Referenz in der Hierarchie von unten nach oben castet, z.B. von TextView nach View. Bei folgendem Beispiel braucht man also keinen expliziten Cast:

Code:
View myView = new TextView(...);

Bei einem Downcast castet man von oben nach unten, deshalb muss man explizit den Cast angeben. Weil findViewById eine View zurückgibt, ist das in deinem Beispiel also ein Downcast.

Code:
TextView tv_title = (TextView) findViewById(R.Id.tv_title);
 
Zurück
Oben Unten