2010-08-06 15 views
5

Mam niestandardowy przycisk, na którym przechwytuję jego onTouchEvent.Android: Niestandardowy przycisk OnClickListener nie jest wywoływany

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

Ten niestandardowy przycisk jest częścią siatki. Kiedy dodaję ten przycisk do siatki, ustawiłem dla niego OnClickListener. Ale kod w OnClickListener nigdy nie jest wywoływany.

kod GridAdapter, gdzie dodaję przycisk ze słuchaczem:

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

Proszę o pomoc.

+0

Po usunięciu kodu OnTouchEvent, działa kod OnClickListener. Czy oba zdarzenia nie mogą być obsługiwane razem? Proszę pomóż! – Pria

+1

nie jesteś pewien, ale jakąkolwiek różnicę, czy zwrócisz wartość true lub false w terminalu onTouch na końcu? –

+0

Próbowałem zwrócić wartość false z onTouchEvent(). to nie działa :(Ponadto zajmuje zdarzenie jako MotionEvent.ACTION_DOWN zawsze – Pria

Odpowiedz

0

Domyślam się, że komentarz Mathias jest poprawny, musisz zwrócić wartość false w metodzie onTouchEvent, gdy chcesz, aby detektor zdarzeń onClick był uruchamiany, zamiast kolejnego detektora zdarzeń onTouch().

Można znaleźć bardziej precyzyjnych int UI Events documentation

+0

Próbowałem zwrócić false z onTouchEvent(). to nie działa :(Dalej, to zdarzenie jako MotionEvent.ACTION_DOWN zawsze – Pria

+0

ok, zapomnij o zwracając wartość false Czy jesteś więc pewien, że getView ustawia nazwę onClickListener? – Longfield

+0

jak tylko skomentuję mój kod onTouchEvent ... kod onClickListener zacznie działać :( – Pria

0

można po prostu wykonać swój kod w OnTouchEvent (kliknięcie jest MotionEvent.ACTION_DOWN jak już wiemy)?

2

Spróbuj wprowadzić w swoim działaniu OnTouchListener (zamiast onClickListener) i zmień onClick() na onTouch(). To działało dla mnie. Zarówno onTouchEvent z mojego widoku niestandardowego, jak i onTouch() z Activity są wywoływane. Pamiętaj, aby zwrócić "false" w onTouch() i "true" w OnTouchEvent widoku niestandardowego.

6

W implementacji onTouchEvent, zamiast „return true;”, zrobić ...

return super.onTouchEvent(event); 

Ty nadrzędnymi wdrożenia nadklasy, która jest, co jest odpowiedzialne za wywołanie słuchacza. Wzywając implementację superklasy, powinna działać tak, jak poprzednio. Dlatego Twój kod działa, gdy komentujesz tę metodę - ponieważ już nie nadpisujesz implementacji superklasy

Powiązane problemy