2012-03-01 35 views
8

Tôi vừa xem qua thông điệp thú vị này từ trình biên dịch và tôi không biết tại sao nó lại xảy ra. Đây là trường hợpTruyền tới nút là không cần thiết - Tại sao?

Ví dụ 1.

Button test = (Button) findViewById(R.id.someButtonId); 
test.setOnClickListener(this); 

Ví dụ 2.

findViewById(R.id.someButtonId).setOnClickListener(this); 

Trong ví dụ đầu tiên, tôi cần phải cast một đối tượng được trả về bởi findViewById-Button. Trong ví dụ thứ hai, tôi không phải truyền đối tượng trả về vì tôi không sử dụng đối tượng lớp Button khác. Nếu tôi cố gắng truyền thông qua

((Button)findViewById(R.id.someButtonId)).setOnClickListener(this); 

Tôi sẽ nhận được cảnh báo Casting findViewById(R.id.someButtonId) to Button is redundant.

Tại sao điều này lại xảy ra? Tôi không cố gắng loại bỏ cảnh báo truyền. Tôi muốn biết logic đằng sau này và tại sao đúc là không cần thiết nếu tôi không cố gắng khởi tạo một đối tượng khác với đối tượng được trả về bởi findViewById.

+0

http://stackoverflow.com/questions/3502690/remove-redundant-casts-in-java –

+0

@Samir Tôi biết cách xóa bỏ :). Tôi không cần điều đó. Tôi hỏi ** tại sao ** không cần thiết. – sandalone

+0

:(Tôi không nhận được cảnh báo – Triode

Trả lời

6

Lý do bạn nhận được điều này là do findViewById trả về View và lớp này đã xác định phương thức setOnClickListener. Điều này có nghĩa là ngay cả khi không làm diễn viên, bạn có thể đặt người nghe. Vì vậy, diễn viên của bạn là dư thừa.

+0

Để hỏi tại đây: có an toàn khi sử dụng nó như trong examp2 không? – sandalone

+1

Hoàn hảo của nó như Ví dụ 2. –

+0

Tại sao bạn nghĩ nó sẽ không an toàn? –

2

Các findViewById() luôn trả về Xem đó là mẹ của tất cả các lần xem như ImageView, Nút ...

Các setOnClickListener là một phương pháp của lớp View. Vì vậy, bạn có thể nắm bắt các sự kiện nhấp chuột đơn giản mà không cần đưa nó vào nút. Tôi nghĩ rằng chỉ có nó nói dư thừa.

0

Tôi đoán setOnClickListener() là một phương thức trong Chế độ xem thay vì Nút và do đó, vâng: dàn diễn viên thừa.

2

Lý do cho điều này là trong Ví dụ 1, bạn cần phải tìm một Nút rõ ràng vì bạn đang gán nó cho một biến Button.

OnClickListener dành cho bất kỳ loại Chế độ xem nào, do đó bạn không cần phải truyền nó vào một lớp con cụ thể của Chế độ xem để đặt OnClickListener cho nó.

+0

Có an toàn không khi sử dụng nó như trong ví dụ 2 ?? ? – sandalone

+1

Tuyệt đối. Bất kỳ Xem nào được tìm thấy trong ví dụ 2, một OnClickListener có thể được đặt trên nó. –

+1

Bạn sẽ biết đó là một nút chắc chắn, vì bạn không sử dụng id someButtonId cho bất kỳ Chế độ xem nào khác, phải không? –

1

Điều này xảy ra vì bạn không cần phải truyền View đến Button để gọi setOnClickListener được xác định trong View. Đủ để làm findViewById(R.id.someButtonId).setOnClickListener(this);

Các vấn đề liên quan