[英]OnClickListener doesn't work implicitly. Why?
我創建了實現監聽器接口的自定義按鈕類:
public class BlinkButton extends Button implements View.OnClickListener {
List<OnClickListener> onClickListenerList = new ArrayList<OnClickListener>();
public BlinkButton(Context context) {
super(context);
this.setListener(new HighLightButtonListener());
}
//other constructors here
public void setListener(OnClickListener listener){
onClickListenerList.add(listener);
}
@Override
public void onClick(View v) {
for(OnClickListener listener : onClickListenerList){
listener.onClick(this);
}
}
我有看法:
<com.example.element.BlinkButton
.../>
我聲稱com.example.element.BlinkButton內的onClick方法應在用戶單擊BlinkButton時隱式調用,但不是。 我必須明確地編寫它: android:onClick="fireEvent"
和
public void fireEvent(View view) {
fireEventButton.onClick(view);
}
為什么選擇BlinkButton.onClick(); 用戶單擊按鈕后不會自動觸發?
Button
(或其超類)本身沒有onClick()
方法。 您實現的一個來自Button類實現的View.OnClickListener
接口。
您從不會設置類的OnClickListener
,並且從您的代碼看來,您希望OnClickListener
成為類本身,因此實際上會調用您的自定義Listeners
。
將此行添加到構造函數中:
setOnClickListener(this);
所以看起來像這樣:
public BlinkButton(Context context) {
super(context);
setOnClickListener(this);
this.setListener(new HighLightButtonListener());
}
您還必須刪除onClick
xml屬性。
BlinkButton類僅實現偵聽器。 如果您查看View類如何處理點擊,則會發現以下實現:
public void setOnClickListener(OnClickListener l) {
if (!isClickable()) {
setClickable(true);
}
getListenerInfo().mOnClickListener = l;
}
基本上沒有方法可以覆蓋方法並獲得click事件。 您可以在您的課程中設置一個監聽器,該監聽器將在單擊時被調用,並將進一步將事件發送給列表中的所有監聽器。
public class BlinkButton extends Button implements View.OnClickListener {
List<OnClickListener> onClickListenerList = new ArrayList<OnClickListener>();
public BlinkButton(Context context) {
super(context);
this.setListener(new HighLightButtonListener());
this.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
for (OnClickListener listener : onClickListenerList) {
listener.onClick(this);
}
}
};
}
//other constructors here
public void setListener(OnClickListener listener) {
onClickListenerList.add(listener);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.