2011-09-12 12 views
8

Mam niestandardowy widok, który działa jak przycisk. Chcę zmienić tło, gdy użytkownik naciśnie go, przywrócić oryginalne tło, gdy użytkownik przesunie palec na zewnątrz lub zwolni go, a ja również chcę obsłużyć zdarzenia onClick/onLongClick. Problem polega na tym, że onTouch wymaga ode mnie zwrotu true dla ACTION_DOWN lub nie wyśle ​​mi zdarzenia ACTION_UP. Ale jeśli zwrócę prawdę, detektor onClick nie będzie działał.Android onTouch z onClick i onLongClick

Myślałem, że rozwiązałem go, zwracając wartość false w onTouch i rejestrując się onClick - jakoś zadziałało, ale było trochę przeciw dokumentom. Właśnie otrzymałem wiadomość od użytkownika, który powiedział mi, że nie może długo kliknąć przycisku, więc zastanawiam się, co jest nie tak.

Część bieżącego kodu:

public boolean onTouch(View v, MotionEvent evt) 
{ 
    switch (evt.getAction()) 
    { 
    case MotionEvent.ACTION_DOWN: 
    { 
     setSelection(true); // it just change the background 
     break; 
    } 

    case MotionEvent.ACTION_CANCEL: 
    case MotionEvent.ACTION_UP: 
    case MotionEvent.ACTION_OUTSIDE: 
    { 
     setSelection(false); // it just change the background 
     break; 
    } 
    } 

    return false; 
} 

public void onClick(View v) 
{ 
    // some other code here 
} 

public boolean onLongClick(View view) 
    { 
    // just showing a Toast here 
    return false; 
    } 


// somewhere else in code 
setOnTouchListener(this); 
setOnClickListener(this); 
setOnLongClickListener(this); 

Jak mogę uczynić je współpracować poprawnie?

góry dzięki

Odpowiedz

10

onClick & onLongClick jest faktycznie wysyłane z View.onTouchEvent.

jeśli przesłonić View.onTouchEvent lub ustawić jakąś konkretną View.OnTouchListener poprzez setOnTouchListener, trzeba dbać o to.

więc kod powinien być coś takiego:

 
public boolean onTouch(View v, MotionEvent evt) 
{ 
    // to dispatch click/long click event, 
    // you must pass the event to it's default callback View.onTouchEvent 
    boolean defaultResult = v.onTouchEvent(evt); 

    switch (evt.getAction()) 
    { 
    case MotionEvent.ACTION_DOWN: 
    { 
     setSelection(true); // just changing the background 
     break; 
    } 
    case MotionEvent.ACTION_CANCEL: 
    case MotionEvent.ACTION_UP: 
    case MotionEvent.ACTION_OUTSIDE: 
    { 
     setSelection(false); // just changing the background 
     break; 
    } 
    default: 
     return defaultResult; 
    } 

    // if you reach here, you have consumed the event 
    return true; 
} 
Powiązane problemy