Android:未调用自定义按钮OnClickListener

时间:2010-08-06 09:05:57

标签: android gridview custom-controls onclick touch

我有一个自定义按钮,我正在捕捉它的onTouchEvent。

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;
}

请帮忙。

4 个答案:

答案 0 :(得分:7)

在onTouchEvent实现中,而不是“return true;”,请执行...

return super.onTouchEvent(event);

你要覆盖超类的实现,这是负责调用监听器的。通过调用超类的实现,它应该像以前一样。这就是为什么你的代码在注释掉方法时有效的原因 - 因为你不再覆盖超类的实现

答案 1 :(得分:2)

尝试在活动中使用OnTouchListener(而不是onClickListener)并将onClick()更改为onTouch()。这对我有用。我的自定义视图中的onTouchEvent和来自Activity的onTouch()都被调用。记得在onTouch()中返回“false”,在自定义视图的OnTouchEvent中返回“true”。

答案 2 :(得分:0)

我猜Mathias的注释是正确的,当你想要触发onClick()事件监听器而不是后续的onTouch()事件监听器时,你必须在onTouchEvent方法中返回false。

您可以找到更多精度int UI Events documentation

答案 3 :(得分:0)

您是否可以在OnTouchEvent中执行代码(如您所知,单击是MotionEvent.ACTION_DOWN)?