2011-05-02 31 views
7

Sự khác biệt giữa việc thêm người nghe và đặt người nghe là gì.thêm người nghe vs người nghe đã đặt

ví dụ:

addTextChangedListener(textWatcher); 
setOnClickListener(clickListener); 

Trả lời:

Sau câu trả lời aioobe của tôi đã thử nghiệm điều này trong dự án của tôi. Vì vậy, chúng tôi có thể làm điều này.

editText.addTextChangedListener(textWatcher1); 
editText.addTextChangedListener(textWatcher2); 

nhưng chúng ta không thể làm điều này. (Nó sẽ thiết lập chỉ người nghe mới nhất trong trường hợp này clickListener2)

button.setOnClickListener(clickListener1); 
button.setOnClickListener(clickListener2); 

Một nghi ngờ

tôi không thể suy nghĩ bất kỳ trường hợp sử dụng trong đó tôi cần hai textWatcher cho editText duy nhất. Ai có thể đưa ra một trường hợp sử dụng như vậy. (Tôi có nên đặt câu hỏi này dưới dạng câu hỏi riêng không?)

Trả lời

17

Nếu bạn có số set -method, thường chỉ có một người nghe. (Cá nhân tôi thích gọi họ là "người xử lý").

Với add -methods, bạn thường có thể có số lượng người nghe tùy ý.

+3

+1 bạn là một người nhanh ... – MByD

+0

@aioobe vì vậy bạn có nghĩa là tôi chỉ có thể đặt một clickListener nhưng tôi có thể thêm nhiều hơn một trình xem văn bản vào một chế độ xem duy nhất trong ví dụ của tôi. – Vivart

+0

Có. Đó sẽ là cách giải thích của tôi với tên phương thức. Bạn nên đọc trên tài liệu API để chắc chắn. – aioobe

1

aioobe là đúng, tất nhiên. Nhưng có một yếu tố bổ sung:

Theo JavaBeans chuẩn

  • getX/isXyzsetXyz xác định tính (xem PropertyDescriptor) nhưng
  • addXyzListener, removeXyzListenergetXyzListeners cũng tiêu chuẩn đặt tên quy ước cho sự kiện Người nghe (xem EventSetDescriptor)

Vì vậy, setXyzListener() không phải là tên phương pháp hợp lệ để đặt người nghe theo tiêu chuẩn JavaBeans! Tất nhiên bạn có thể chọn để vi phạm các tiêu chuẩn JavaBeans cố ý, nhưng tôi đang cố gắng để giữ cho bạn khỏi làm điều đó một cách vô ý :-)

0

Theo ý kiến ​​của tôi không có lý do chính đáng nào cho phương thức setXxxListener thay vì addXxxListener. Tôi chắc rằng những phương thức "set" này tồn tại đơn giản chỉ vì sự lười biếng của lập trình viên. Thật buồn vì việc hỗ trợ danh sách người nghe không khó hơn nhiều so với việc hỗ trợ một người nghe duy nhất. Nó có thể đúng là bạn thường chỉ mong đợi một người nghe quan tâm, nhưng có nhiều lý do tốt để hỗ trợ danh sách của họ anyway.

Ví dụ yêu thích của tôi về danh sách người nghe cần là hỗ trợ gỡ lỗi. Bạn có thể muốn thêm một trình lắng nghe chẩn đoán để giám sát một số hoạt động, nhưng chỉ với các phương thức setXxxListener, hành động gỡ lỗi có thể phá vỡ mã của bạn! Điểm mấu chốt là khi viết một lớp quan sát bạn không muốn đưa ra giả định không cần thiết về cách nó sẽ được sử dụng.

Đây là soạn sẵn cho một số lớp quan sát được gọi MyModel:

public interface MyModelChangeListener { public void changed(MyModel model); } 
private ArrayList<MyModeChangeListener> listeners = new ArrayList<MyModeChangeListener>(); 
public void addMyModeChangeListener(MyModeChangeListener tcl) { listeners.add(tcl); } 
public void removeMyModeChangeListener(MyModeChangeListener tcl) { listeners.remove(tcl); } 
protected void fireMyModeChange() { for(MyModeChangeListener mmcl : listeners) mmcl.changed(this); } 

Các bên quan tâm thêm người nghe khi cần thiết, và việc thực hiện MyModel và bất kỳ phụ các lớp học chỉ cần gọi

fireMyModeChange(this) whenever their observable states change. 

Tôi tạo ra issue 5711 trong trình theo dõi vấn đề dự án Android về vấn đề này. Vui lòng gắn dấu sao và có thể thêm nhận xét của chính bạn ở đó nếu bạn đồng ý điều này sẽ được khắc phục trong toàn bộ Android SDK.

0

addListener là chuẩn Java bean và setListener là chuẩn Android, cả hai đều đang sử dụng trong ngữ cảnh khác nhau. addListner chỉ được sử dụng trong trường hợp của Desktop và lập trình web bởi vì ở đây chúng ta phải đối phó với nhiều thành phần hoàn toàn. Trong Android, setListener được sử dụng vì ở đây chúng tôi có một hoạt động. Tại một số điểm, chúng tôi đang sử dụng addListiner như addTextWatcher đó là vì trong một hoạt động duy nhất, chúng tôi phải đối phó với nhiều EditText.

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