2012-07-28 17 views
10

Tengo problemas para detectar la pulsación larga en mi vista personalizada.Pulsación larga Android

Aquí está el código relacionado con este tema

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

Este código detecta todos y cada uno (corto) haga clic en la prensa siempre.

Cuando coloco este código en la clase heredada de Activity, funciona.

¿Por qué no funciona en la vista personalizada?

+0

Volviendo verdadero de onTouchEvent fijo esto para mí – Manuel

Respuesta

23

Todo este código va en la clase de vista personalizada:

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

También debería llamar removeCallbacks en MotionEvent.ACTION_CANCEL. – kasgoku

+2

Debe eliminar ACTION_MOVE porque cancelará el controlador. –

+1

¡¡Trabajando bien ... !!! – InsaneCat

2

No estoy seguro, pero el constructor GestureDetector está en desuso (here). ¿Podrías probar otros que necesitan un contexto como primer parámetro?

Lo siento, soy nuevo, así que no puedo publicar comentarios.

- Editado -

Parece que utilizó otra oyente, esta View.OnTouchListener tiene otro método onTouch(). ¿Podrías intentarlo de nuevo?

- Editado -

Aquí es un ejemplo (que funcionó para mí):

... 
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

lo he intentado también, pero no funciona :( –

+0

Cómo hacerlo, no te entiendo? –

+1

De nada :-) Creo que puedes responderte a ti mismo, para ayudar a otras personas que leen tu pregunta. – Anh3Saigon

3

¿Ha habilitado presiones largas en su GestureDetector? Puede habilitarlo utilizando un constructor apropiado o llamando al setIsLongpressEnabled. Por ejemplo, puede hacer:

gestureDetector.setIsLongpressEnabled(true); 

en su constructor.

+1

La pulsación larga todavía no funciona –

+0

por casualidad Me funciona. Gracias +1 por eso –

0

es mejor que supongo ..

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