Android: пользовательская кнопка OnClickListener не вызывается - PullRequest
5 голосов
/ 06 августа 2010

У меня есть пользовательская кнопка, на которой я фиксирую ее на TouchEvent.

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 ]

7 голосов
/ 02 марта 2011

В вашей реализации onTouchEvent вместо «return true;» выполните ...

return super.onTouchEvent(event);

Вы переопределяете реализацию суперкласса, которая отвечает за вызов слушателя.Вызывая реализацию суперкласса, он должен действовать как прежде.Вот почему ваш код работает, когда вы закомментируете метод - потому что вы больше не переопределяете реализацию суперкласса

2 голосов
/ 20 октября 2010

Попробуйте внедрить OnTouchListener в свою деятельность (вместо onClickListener) и измените onClick () на onTouch (). Это сработало для меня. Вызываются как onTouchEvent из моего пользовательского представления, так и onTouch () из Activity. Не забывайте возвращать «false» в onTouch () и «true» в OnTouchEvent вашего пользовательского представления.

0 голосов
/ 06 августа 2010

Можете ли вы просто выполнить свой код в OnTouchEvent (как вы уже знаете, клик - MotionEvent.ACTION_DOWN)?

0 голосов
/ 06 августа 2010

Полагаю, что комментарий Матиаса правильный, вы должны возвращать false в вашем методе onTouchEvent, когда вы хотите, чтобы прослушиватель события onClick () запускался вместо последующего прослушивателя события onTouch ().

Вы можете найти более точную документацию по int UI Events

...