2012-07-28 25 views
10

Mam problemy z wykrywaniem długiego naciśnięcia w moim widoku niestandardowym.Długie naciśnięcie przycisku Android

Oto kod związany z tą kwestią

final GestureDetector gestureDetector = new GestureDetector(new GestureDetector.SimpleOnGestureListener() { 
    public void onLongPress(MotionEvent e) { 
     Log.e("dbg_msg", "onLongPress"); 
    } 
}); 

public boolean onTouchEvent(MotionEvent event) { 
    return gestureDetector.onTouchEvent(event); 
}; 

Kod ten wykrywa każdy pojedynczy (krótka) tak długo, kliknij przycisk.

Po umieszczeniu tego kodu w klasie odziedziczonej z działania, działa.

Dlaczego więc nie działa w widoku niestandardowym?

+0

Wracając prawda od onTouchEvent stałe to dla mnie – Manuel

Odpowiedz

23

Wszystko to idzie w kodzie niestandardowego widoku klasy:

public static int LONG_PRESS_TIME = 500; // Time in miliseconds 

final Handler _handler = new Handler(); 
Runnable _longPressed = new Runnable() { 
    public void run() { 
     Log.i("info","LongPress"); 
    } 
}; 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    switch(event.getAction()){ 
    case MotionEvent.ACTION_DOWN: 
     _handler.postDelayed(_longPressed, LONG_PRESS_TIME); 
     break; 
    case MotionEvent.ACTION_MOVE: 
     _handler.removeCallbacks(_longPressed); 
     break; 
    case MotionEvent.ACTION_UP: 
     _handler.removeCallbacks(_longPressed); 
     break; 
    } 
    return true; 
} 
+0

Powinien również wywołać removeCallbacks w MotionEvent.ACTION_CANCEL. – kasgoku

+2

Powinieneś usunąć ACTION_MOVE, ponieważ spowoduje to anulowanie programu obsługi. –

+1

Działa dobrze ... !!! – InsaneCat

2

Nie jestem pewien, ale Twój konstruktor GestureDetector jest przestarzały (). Czy mógłbyś wypróbować inne, które wymagają kontekstu jako pierwszego parametru?

Niestety, jestem nowy, więc nie mogę publikować komentarzy.

- Zmieniano -

Wydaje użyłeś innego słuchacza, to View.OnTouchListener ma innej metody onTouch(). Czy mógłbyś spróbować jeszcze raz?

- Zmieniano -

Oto przykład (pracował dla mnie):

... 
mAnotherView.setOnTouchListener(new View.OnTouchListener() { 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     return mGestureDetector.onTouchEvent(event); 
    } 
}); 

... 
mGestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() { 

    @Override 
    public void onLongPress(MotionEvent e) { 
     // do your tasks here 
    } 
}); 
+0

Próbowałem że zbyt, ale to nie działa :( –

+0

Jak to zrobić, nie dostaję Cię? –

+1

Nie ma za co :-) Myślę, że możesz odpowiedzieć sobie, aby pomóc innym osobom w czytaniu Twojego pytania. – Anh3Saigon

3

Czy włączyć długie naciska na swojej GestureDetector? Możesz włączyć to za pomocą odpowiedniego konstruktora lub dzwoniąc pod numer setIsLongpressEnabled. Na przykład, możesz zrobić:

gestureDetector.setIsLongpressEnabled(true); 

w twoim konstruktorze.

+1

Długie naciśnięcie wciąż nie działa –

+0

przez przypadek To działa dla mnie. dzięki +1 za to –

0

Lepiej Chyba ..

public class Workflow extends View implements View.OnLongClickListener { 

public Workflow(Context context, DisplayFeatures d) { 
    super(context); 

    setLongClickable(true); 
    setOnLongClickListener(this); 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    /* onTouchEvent should return super.onTouchEvent(event);, otherwise long click wouldn't be performed */ 
    return super.onTouchEvent(event); 
} 

@Override 
public boolean onLongClick(View v) { 
    Log.d("VIEW", "LONG CLICK PERFORMED!"); 
    return false; 
} 
} 
Powiązane problemy