Perché android onLongPress viene sempre licenziato dopo onDoubleTap?

Ho azioni onLongPress e onDoubleTap posizionate sul button in base a questo codice:

... GestureDetector detector = new GestureDetector(this, new TapDetector()); public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); detector = new GestureDetector(this, new TapDetector()); ... } private class TapDetector extends GestureDetector.SimpleOnGestureListener { @Override public boolean onDoubleTap(MotionEvent e) { // Do something return true; } @Override public void onLongPress(MotionEvent e) { // Do something } } Button incomeButton = (Button) findViewById(R.id.income); button.setOnTouchListener(new OnTouchListener(){ @Override public boolean onTouch(View v, MotionEvent event) { detector.onTouchEvent(event); return true; } }); 

Ho sempre visto onLongPress sparato dopo che onDoubleClick è stato licenziato ed eseguito. Qual è la ragione di tale comportmento contrastante e come evitarlo?

  • Pulsante per cuffia con doppio click in android
  • Come chiudere un WebView con un doppio clic?
  • Come posso creare un evento a singolo clic e un evento a doppio clic quando si preme il button Menu?
  • Phonegap 2.4.0 con Android 4.2 - comportmento strano di doppio clic
  • Implementare il doppio clic per il button in Android
  • Android: Come rilevare il doppio touch?
  • AGGIORNATO Ho cambiato il codice sorgente per essere più specifico

     public class MainActivity extends Activity { private GestureDetector detector; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); detector = new GestureDetector(this, new TapDetector()); Button button = (Button) findViewById(R.id.button); button.setOnTouchListener(new OnTouchListener(){ @Override public boolean onTouch(View v, MotionEvent event) { System.out.println("************* onTouch *************"); detector.onTouchEvent(event); return true; } }); } class TapDetector extends GestureDetector.SimpleOnGestureListener { @Override public void onLongPress(MotionEvent e) { System.out.println("************* onLongPress *************"); } @Override public boolean onDoubleTap(MotionEvent e) { System.out.println("************* onDoubleTap *************"); Intent intent = new Intent(); intent.setClass(getApplicationContext(), NewActivity.class); intent.putExtra("parameterName", "parameter"); startActivity(intent); return true; } } } 

    Questo è un log dopo che ho scattato suDoubleTap . Potete vedere onLongPress alla fine – non lo scatto mai.

     I/System.out( 1106): ************* onTouch ************* I/System.out( 1106): ************* onTouch ************* I/System.out( 1106): ************* onTouch ************* I/System.out( 1106): ************* onDoubleTap ************* I/ActivityManager( 59): Starting activity: Intent { cmp=my.tapdetector/.NewActivity (has extras) } I/ActivityManager( 59): Displayed activity my.tapdetector/.NewActivity: 324 ms (total 324 ms) I/System.out( 1106): ************* onLongPress ************* 

    UPDATE Ho trovato la soluzione. Per evitare il lancio suLongPress occorre fare due modifiche:

    In primo luogo: detector.setIsLongpressEnabled ( true ); in onTouch (Visualizza v, evento MotionEvent)

      button.setOnTouchListener(new OnTouchListener(){ @Override public boolean onTouch(View v, MotionEvent event) { System.out.println("************* onTouch *************"); detector.onTouchEvent(event); detector.setIsLongpressEnabled(true); return true; } }); 

    Secondo: aggiungere detector.setIsLongpressEnabled ( falso ); in onDoubleTap (MotionEvent e)

      public boolean onDoubleTap(MotionEvent e) { detector.setIsLongpressEnabled(false); System.out.println("************* onDoubleTap *************"); Intent intent = new Intent(); intent.setClass(getApplicationContext(), NewActivity.class); intent.putExtra("parameterName", "parameter"); startActivity(intent); return true; } 

    2 Solutions collect form web for “Perché android onLongPress viene sempre licenziato dopo onDoubleTap?”

    Tecnicamente questo non dovrebbe accadere

     case MotionEvent.ACTION_DOWN: mLastMotionX = x; mLastMotionY = y; mCurrentDownEvent = MotionEvent.obtain(ev); mAlwaysInTapRegion = true; mInLongPress = false; if (mIsLongpressEnabled) { mHandler.removeMessages(LONG_PRESS); mHandler.sendEmptyMessageAtTime(LONG_PRESS, mCurrentDownEvent.getDownTime() + tapTime + longpressTime); } mHandler.sendEmptyMessageAtTime(SHOW_PRESS, mCurrentDownEvent.getDownTime() + tapTime); 

    perché nell'evento ACTION_DOWN o ACTION_UP tutti gli events di messaggi LONG_PRESS vengono rimossi dalla coda. Quindi, sul secondo touch, il seguente codice rimuoverà gli events di printing lunghi.

      mHandler.removeMessages(LONG_PRESS); 

    Ninja edit: soluzione per hacky per il tuo problema

      @Override public void onLongPress(MotionEvent e) { if(MainActivity.this.hasWindowFocus()) { Log.d("Touchy", "Long tap"); } } 

    Vedete sempre il onLongPress sparato perché nel tuo codice lanciate un'intenzione prima di consumare l'evento onDoubleTap.
    Puoi distriggersre onLongPress by
    public void setIsLongpressEnabled (boolean isLongpressEnabled)
    e utilizzare il metodo onDown per eseguire l'azione.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.