2016-03-09 36 views
0

我正在製作一個自定義按鈕,它被設計爲在內部處理onClick事件。這裏是我的實現的簡化版本:Android按鈕內部onClick動作

public class CustomButton extends Button implements View.OnClickListener { 
    public CustomButton(Context context) { 
     super(context); 
     setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     setText("Clicked!"); 
    } 
} 

上面的代碼沒有意外!問題是活動/片段/無論包含按鈕可能會調用setOnClickListener(View)這將阻止按鈕內的onClick(View)方法接收onClick事件,從而以不希望的方式更改我的按鈕的功能。我雖然關於覆蓋setOnClickListener(View)拋出一個異常如果參數不是this,但我不想阻止該按鈕有外部偵聽器,我只是想添加一個內部功能。

Button哪一種方法,如果有的話,我可以重寫,以便在點擊按鈕時做額外的事情,而不會丟掉其他類監聽onClick事件的能力?基本上哪個方法在Button發送OnClick事件?

+0

'Button'不派遣'OnClick'事件,系統會。 – Shark

+0

按鈕必須以某種方式接收點擊事件,因爲它的外觀已更改。 – Helios

+0

Button的可視部分接收到狀態改變,並且它在「android:state_pressed」狀態中自行繪製。但是這與'Button'的代碼無關,而是它的選擇器。 [隨意閱讀](http://developer.android.com/guide/topics/ui/controls/button.html),如果你已經沒有。 – Shark

回答

0

我想到了一個解決方案。我做了CustomButton如下:

public class CustomButton extends Button implements View.OnClickListener { 
    private OnClickListener externalOnClickListener; 

    public CustomButton(Context context) { 
     super(context); 
     super.setOnClickListener(this); 
    } 


    public CustomButton(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     super.setOnClickListener(this); 
    } 

    public CustomButton(Context context, AttributeSet attrs, int defStyleAttrs) { 
     super(context, attrs, defStyleAttrs); 
     super.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     // Do all of my stuff 
     setText("Clicked!"); 
     setBackground(Color.GREEN); 

     // Pass onClick event to external listener 
     if (externalOnClickListener != null) {    
      externalOnClickListener.onClick(v); 
     } 
    } 

    @Override 
    public void setOnClickListener(OnClickListener l) { 
     externalOnClickListener = l; 
    } 
} 

基本上setOnClickListener()被重寫,以便它只是存儲傳入聽者作爲一個實例變量。在構建時,按鈕將它自己設置爲自己的點擊監聽器,以便它可以接收點擊事件,執行某些操作,然後將事件傳遞給存儲的監聽器。