【问题标题】:Android: Custom button OnClickListener is not getting invokedAndroid:未调用自定义按钮 OnClickListener
【发布时间】:2010-08-06 09:05:57
【问题描述】:

我有一个自定义按钮,我正在捕获它的 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;
}

请帮忙。

【问题讨论】:

  • 如果我删除 OnTouchEvent 代码,则 OnClickListener 代码可以工作。两个事件不能一起处理???请帮忙!
  • 不确定,但最后在 onTouch 中返回 true 还是 false 有什么区别?
  • 我试图从 onTouchEvent() 返回 false。它不起作用:(此外,它始终将事件视为 MotionEvent.ACTION_DOWN

标签: android gridview custom-controls onclick touch


【解决方案1】:

在您的 onTouchEvent 实现中,不要使用“return true;”,而是...

return super.onTouchEvent(event);

您正在覆盖负责调用侦听器的超类的实现。通过调用超类的实现,它应该像以前一样工作。这就是当您注释掉方法时您的代码可以工作的原因——因为您不再覆盖超类的实现

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我猜 Mathias 的评论是正确的,当您希望触发 onClick() 事件侦听器而不是后续的 onTouch() 事件侦听器时,您必须在 onTouchEvent 方法中返回 false。

      你可以找到更精确的int UI Events documentation

      【讨论】:

      • 我试图从 onTouchEvent() 中返回 false。它不起作用:(此外,它始终将事件视为 MotionEvent.ACTION_DOWN
      • 好的,忘记返回 false。那么你确定调用了设置 onClickListener 的 getView 吗?
      • 一旦我评论了我的 onTouchEvent 代码...onClickListener 代码开始工作:(
      【解决方案4】:

      您可以在 OnTouchEvent 中执行您的代码吗(您已经知道单击是 MotionEvent.ACTION_DOWN)?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-11
        • 1970-01-01
        • 2019-02-08
        • 2014-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多