2013-11-02 23 views
5

Ich fange an, Android-Programmierung zu lernen. Wenn Sie Objekte vom Typ EditText deklarieren und später initialisieren, warum wird der Inhalt findViewById in EditText umgewandelt?Warum werfen Sie (EditText) findViewById auf (EditText)?

Was gibt findViewById zurück, die gegossen werden muss?

+12

findViewById gibt ein Objekt vom Typ View zurück. Sie müssen es also beim Aufruf in den entsprechenden Typ umwandeln. Siehe Referenz: http://developer.android.com/reference/android/app/Activity.html#findViewById(int) –

Antwort

3

Wie daniel_c05 darauf hingewiesen, findViewById Rückgabetyp ist View (das ist die Elternklasse für EditText und andere Klassen für visuelle Widgets).

In Java müssen Sie in diesem Fall auf einen bestimmten Typ umstellen - das ist die Anforderung der Sprache.

0

Ich weiß nicht, wie viel Programmiererfahrung Sie mit verschiedenen Sprachen haben. Aber das ist ein ziemlich gebräuchliches Konzept in vielen Sprachen. Und es ist alles andere als sehr logisch. Lassen Sie mich das mit zwei verschiedenen Ansätzen erklären: -

1) Wenn Sie Erfahrung mit C haben, würden Sie es sehr ähnlich finden. Also, in C, lassen Sie sagen, wenn Sie malloc() verwenden, einen Teil des Speichers zuzuweisen, Sie sagen nur

malloc(numberOfBytesYouNeed); 

Nun, was malloc tut, ist, dass er die angeforderte Anzahl von Bytes für Sie (falls vorhanden) behält und gibt ein void * zurück, das auf die Startadresse des zugewiesenen Speicherbereichs zeigt.

Jetzt, obwohl Sie den Void-Zeiger mit Ihnen haben, möchten Sie immer noch auf den Speicher zugreifen, der auf eine bestimmte Weise zugeordnet ist. Recht ? Sie können also auf den zugewiesenen Speicher mit einem Skalierungsfaktor von 2 (für ganze Zahlen) oder 1 (für Zeichen) usw. zugreifen.

Darüber hinaus wird Ihnen der Zeiger, den malloc() zurückgegeben hat, nur zur Verfügung stehen, wenn Sie ihn zuweisen zu einem deiner eigenen Zeiger. Wenn Sie, wie oben erwähnt, 2 Byte Ganzzahlen in dem neu zugewiesenen Speicher speichern möchten, benötigen Sie einen Integer-Zeiger, um auf dieses Array von Ganzzahlen zuzugreifen.

Da Sie einen Integer-Zeiger benötigen, müssen Sie den von malloc() zurückgegebenen void-Zeiger Ihrem Integer-Zeiger zuweisen. Etwas wie dieses: -

int * myPointer= malloc(numberOfBytesYouNeed); 

Aber entsprechend der Sprachensemantik würde dies ein Kompilierzeitfehler sein. Weil Sie nur einander ähnliche Zeiger zuweisen können.

Daher müssten Sie die von malloc() zurückgegebene void * auf einen int * schreiben. Etwas wie folgt aus: -

int * myPointer= (int*)malloc(numberOfBytesYouNeed); 

Jetzt ähnlich ist das Konzept in Android (oder einer anderen Programmiersprache für diese Angelegenheit) als auch. Wie oben beschrieben, ist der Rückgabetyp findViewById View (die Elternklasse für EditText und andere Klassen für visuelle Widgets). Aber da Sie tatsächlich auf dieses View-Objekt zugreifen möchten, das von findViewById als EditText-Objekt zurückgegeben wird, müssten Sie es auf einen Typ schreiben.

2) Nun wäre das andere Beispiel sehr einfach. Sagen wir, du weißt nur auf Deutsch zu sprechen.Jetzt treffen Sie zufällig ein heißes Küken, das nur auf Hindi sprechen kann. Aber sie versteht Deutsch. Wenn du sie jetzt auf Deutsch fragst, ob sie daran interessiert wäre, mit dir zu einem Date zu gehen (findViewById), würde sie es definitiv verstehen. Aber da sie nicht Deutsch sprechen kann, würde sie auf Hindi antworten. Nun, selbst wenn ihre Antwort JA wäre, wäre es für dich nicht sehr nützlich. Was Sie hier benötigen, ist ein Übersetzer, um ihre Antwort, die in Hindi (View Object) ist, in etwas zu konvertieren, das Sie verstehen würden, d. H. Deutsch (Text bearbeiten Objekt)

Hope die Antwort hilft!