2010-08-06 70 views
5

自定義按鈕我有一個自定義按鈕,上我捕捉它的onTouchEvent。安卓:OnClickListener是沒有得到調用

public class CustomNumber extends ToggleButton { 
boolean drawGlow = false; 
float glowX = 0; 
float glowY = 0; 
float radius = 30; 


public CustomNumber(Context context) { 
    super(context); 
} 


public CustomNumber(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 


public CustomNumber(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
} 


Paint paint = new Paint(); 
{ 
    paint.setAntiAlias(true); 
    paint.setColor(Color.WHITE); 
    paint.setAlpha(70); 
}; 

@Override 
public void draw(Canvas canvas){ 
    super.draw(canvas); 
    if(drawGlow) 
     canvas.drawCircle(glowX, glowY, radius, paint); 
} 

@Override 
public boolean onTouchEvent(MotionEvent event){ 
    if(event.getAction() == MotionEvent.ACTION_DOWN){ 
     drawGlow = true; 
    }else if(event.getAction() == MotionEvent.ACTION_UP) 
     drawGlow = false; 
    } 
    glowX = event.getX(); 
    glowY = event.getY(); 
    this.invalidate(); 
    return true; 
} 

此自定義按鈕是網格的一部分。當我將這個按鈕添加到網格時,我已經爲它設置了一個OnClickListener。但是,OnClickListener中的代碼永遠不會被調用。

GridAdapter代碼,其中我與聽衆添加按鈕:

public View getView(final int position, final View convertView, final ViewGroup parent) { 
    CustomNumber tBtn; 
    if (convertView == null) { 
     tBtn = new CustomNumber(context); 
     tBtn.setTextOff(""); 
     tBtn.setTextOn(""); 
     tBtn.setChecked(false); 
     tBtn.setId(position); 
     tBtn.setOnClickListener(tBtnListener); 
     tBtn.setLayoutParams(new GridView.LayoutParams(35, 35)); 
    } else { 
     tBtn = (CustomNumber) convertView; 
    } 
    return tBtn; 
} 

請幫助。

+0

如果我刪除的onTouchEvent代碼,那麼OnClickListener代碼工作。不能同時處理這兩個事件?請幫忙! – Pria 2010-08-06 09:08:32

+1

不確定,但是在最後的onTouch中是否返回true或false會有什麼區別? – 2010-08-06 09:27:38

+0

我試圖從onTouchEvent()返回false。它不工作:(此外,它採用事件作爲MotionEvent.ACTION_DOWN總是 – Pria 2010-08-06 10:08:36

回答

0

我想馬蒂亞斯的評論是正確的,當你想觸發onClick()事件偵聽器而不是隨後的onTouch()事件偵聽器時,你必須在你的onTouchEvent方法中返回false。

你可以找到更精確的INT UI Events documentation

+0

我試圖從的onTouchEvent()返回false。它不工作:(此外,它採用事件作爲MotionEvent.ACTION_DOWN總是 – Pria 2010-08-06 10:07:50

+0

OK,忘掉返回false。那麼你確定getView設置onClickListener被調用? – Longfield 2010-08-06 10:56:15

+0

只要我評論我的onTouchEvent代碼... onClickListener代碼開始工作:( – Pria 2010-08-06 10:58:59

0

你能剛的onTouchEvent執行代碼(點擊是MotionEvent.ACTION_DOWN因爲你已經知道)?

2

嘗試在你的活動(而不是onClickListener)impelementing OnTouchListener和更改的onClick()來onTouch()。這對我有效。我的自定義視圖中的onTouchEvent和Activity中的onTouch()都被調用。記住要在自定義視圖的OnTouchEvent中返回「false」onTouch()和「true」。

6

在你的onTouchEvent實現,而不是「返回true;」做......

return super.onTouchEvent(event); 

你覆蓋了超類的實現而這一點正是負責調用偵聽器。通過調用超類的實現,它應該像以前那樣行事。這就是爲什麼你的代碼的工作,當你註釋掉的方法 - 因爲你不再重寫超類的實現