2011-09-28 6 views
14

Tôi đã tạo thành phần tùy chỉnh như Mybutton.java và tôi đã đặt trình nghe onclick trong Mybutton.java.android-đa onClick listener trong một nút

Bây giờ, trong hoạt động mới của mình, tôi phải gọi một Mybutton và thêm nội dung vào trình nghe onclick.

Tuy nhiên, nếu tôi sử dụng OnClickListener mClickListener = new OnClickListener(){...... , nó sẽ thay thế nội dung cũ. Tôi hy vọng nó có thể làm người nghe cũ và mới với nhau.

Tôi đã tìm kiếm một số thông tin, phát hiện ra tôi có thể triển khai phương pháp này. Sau nhiều lần thử, tôi vẫn gặp lỗi.

Có ai cho tôi một ví dụ đơn giản để tôi có thể tìm hiểu cách sửa đổi không?

+0

Tôi không chắc chắn lý do tại sao bạn muốn có nhiều người biết lắng nghe, bạn có thể cho tôi một trường hợp sử dụng? – CommonMan

+0

Chính xác MyButton.java là gì? Đây có phải là tệp chứa lớp học mở rộng lớp Nút android không? –

Trả lời

32

Tôi không nghĩ có API trong API Android cho phép nhiều người nghe onClick. Bạn sẽ cần một số lớp tùy chỉnh xử lý một đơn onClick() và chuyển vào trình xử lý để gọi. Một cái gì đó như thế này:

private class CompositeOnClickListener implements View.OnClickListener{ 
    List<View.OnClickListener> listeners; 

    public CompositeOnClickListener(){ 
     listeners = new ArrayList<View.OnClickListener>(); 
    } 

    public void addOnClickListener(View.OnClickListener listener){ 
     listeners.add(listener); 
    } 

    @Override 
    public void onClick(View v){ 
     for(View.OnClickListener listener : listeners){ 
      listener.onClick(v); 
     } 
    } 
} 

Khi cài đặt của bạn nút của bạn, làm:

CompositeOnClickListener groupListener = new CompositeOnClickListener(); 
myButton.setOnClickListener(groupListener); 

Sau đó, bất cứ khi nào bạn muốn thêm người nghe khác, chỉ cần gọi

groupListener.addOnClickListener(new View.OnClickListener(){ 
    @Override 
    public void onClick(View v){ 
     **** Custom implementation **** 
    } 
}); 
+0

Tôi đã cố gắng tạo lớp tùy chỉnh mở rộng Nút và triển khai View.OnClickListener, nhưng tiếc là phương thức triển khai onClick() không được kích hoạt:/ – BlueMan

+0

Nếu bạn đang triển khai một lớp mới, thì bạn cần phải thêm nó vào đối tượng Xem qua 'setOnClickListener'. Nếu bạn đang ghi đè trực tiếp Chế độ xem, thì bạn có thể ghi đè trực tiếp 'onClick()' để xử lý. – DeeV

+0

Tôi cần thứ gì đó sắp xếp cho OnTouchListener, điều này đã giúp tôi tiết kiệm thời gian! Cảm ơn @DeeV – alchemist

4

Bạn có thể tạo tùy chỉnh của bạn Button lớp học như sau:

public class MyButton extends Button { 

    private CustomOnClickListener mCustomOnClickListener; 

    public interface CustomOnClickListener { 
     void onClick(View v); 
    } 


    public MyButton(Context context) { 
     super(context); 

     // Set your own onClickListener 
     View.OnClickListener ocl = new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // Do whatever you want to do 

       // Invoke the other added onclick listener 
       if(mCustomOnClickListener != null) { 
        mCustomOnClickListener.onClick(v); 
       } 
      } 
     }; 
     setOnClickListener(ocl); 
    } 

    // use this function to set the other onclick listener 
    public void setCustomOnClickListener(CustomOnClickListener cl) { 
     mCustomOnClickListener = cl; 
    } 

    } 

và sử dụng nó như thế này:

// create your button 
    MyButton button = new MyButton(context); 
    // add your custom onClickListener 
    button.setCustomOnClickListener(new MyButton.CustomOnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // Do whatever you intend to do after the actual onClickListener 
      // from MyButton class has been invoked. 
     } 
    });