2010-08-06 69 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); 

你覆盖了超类的实现而这一点正是负责调用侦听器。通过调用超类的实现,它应该像以前那样行事。这就是为什么你的代码的工作,当你注释掉的方法 - 因为你不再重写超类的实现