2013-11-02 14 views
5

Tôi bắt đầu học lập trình Android. Khi bạn khai báo các đối tượng thuộc loại EditText và khởi tạo chúng sau này, tại sao bạn truyền nội dung của findViewById tới EditText?Tại sao bạn truyền (EditText) findViewById thành (EditText)?

Điều gì làm findViewById trở lại cần phải được truyền?

+12

findViewById trả về đối tượng thuộc loại Chế độ xem. Vì vậy, bạn cần phải đưa nó vào loại thích hợp khi bạn gọi nó. Xem tham khảo: http://developer.android.com/reference/android/app/Activity.html#findViewById(int) –

Trả lời

3

Khi daniel_c05 chỉ ra, findViewById loại trả về là View (là lớp cha mẹ cho EditText và các lớp khác dành cho tiện ích trực quan).

Trong Java, bạn cần truyền sang một loại cụ thể trong trường hợp này - đó là yêu cầu của ngôn ngữ.

0

Tôi không biết bạn có bao nhiêu kinh nghiệm lập trình với các ngôn ngữ khác nhau. Nhưng đây là một khái niệm khá được sử dụng trong nhiều ngôn ngữ. Và đó là tất cả nhưng rất hợp lý. Hãy để tôi giải thích điều này bằng cách sử dụng 2 cách tiếp cận: -

1) Nếu bạn có bất kỳ trải nghiệm mã hóa nào với C, bạn sẽ thấy nó rất giống nhau. Vì vậy, trong C, chúng ta hãy nói khi bạn sử dụng malloc() để phân bổ một đoạn bộ nhớ, bạn chỉ cần nói

malloc(numberOfBytesYouNeed); 

Bây giờ những gì malloc không là nó giữ số yêu cầu của byte cho bạn (nếu có) và trả về một khoảng trống * trỏ vào địa chỉ bắt đầu của đoạn bộ nhớ được cấp phát.

Bây giờ mặc dù bạn có con trỏ trống với bạn, bạn vẫn muốn truy cập vào bộ nhớ được phân bổ theo một cách nhất định. Đúng ? Vì vậy, bạn có thể muốn truy cập bộ nhớ được cấp phát với hệ số tỷ lệ là 2 (cho số nguyên) hoặc 1 (đối với ký tự), v.v.

Hơn nữa, con trỏ mà malloc() trả về sẽ chỉ có thể truy cập được nếu bạn gán đến một trong những con trỏ của riêng bạn. Bây giờ như tôi đã đề cập ở trên, nếu bạn muốn lưu trữ 2 số nguyên byte trong bộ nhớ mới được cấp phát, sau đó truy cập mảng bộ nhớ này của số nguyên, bạn sẽ cần một con trỏ nguyên.

Vì bạn sẽ cần một con trỏ nguyên, bạn sẽ phải gán con trỏ void trả về bởi malloc() cho con trỏ nguyên của bạn. Một cái gì đó như thế này: -

int * myPointer= malloc(numberOfBytesYouNeed); 

Nhưng theo ngữ nghĩa ngôn ngữ, đây sẽ là lỗi thời gian biên dịch. Bởi vì bạn chỉ có thể gán các con trỏ tương tự với nhau.

Do đó, bạn sẽ cần phải nhập đúng khoảng trống * được trả về bởi malloc() vào một int *. Một cái gì đó như thế này: -

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

Bây giờ tương tự như là khái niệm trong Android (hoặc bất kỳ ngôn ngữ lập trình khác cho rằng vấn đề) là tốt. Như được giải thích bởi những người khác ở trên, kiểu trả về findViewById là View (là lớp cha mẹ cho EditText và các lớp khác cho các widget trực quan). Nhưng kể từ đó, bạn thực sự muốn truy cập đối tượng View này được trả về bởi findViewById như một đối tượng EditText, bạn sẽ cần phải định kiểu nó thành một đối tượng.

2) Bây giờ ví dụ khác, sẽ rất cơ bản. Giả sử bạn biết chỉ nói tiếng Đức.Bây giờ bạn tình cờ gặp một chú gà nóng biết nói chỉ bằng tiếng Hindi. Nhưng cô ấy hiểu tiếng Đức. Bây giờ nếu bạn hỏi cô ấy bằng tiếng Đức, nếu cô ấy muốn đi chơi với bạn vào một ngày, (findViewById), cô ấy chắc chắn sẽ hiểu nó. Nhưng vì cô ấy không biết nói tiếng Đức, cô ấy sẽ trả lời bằng tiếng Hindi. Bây giờ ngay cả khi câu trả lời của cô là CÓ, nó sẽ không thực sự hữu ích cho bạn. Những gì bạn cần ở đây là một dịch giả để chuyển đổi (typecast) câu trả lời của cô ấy, bằng tiếng Hindi (View Object), thành thứ mà bạn sẽ hiểu, tức là Đức (đối tượng EditText)

Hy vọng câu trả lời sẽ hữu ích!