2016-12-26 3 views

Répondre

1

Vous pouvez setOnItemLongClickListener, vous pouvez définir la vue que vous touchez une OnTouchListener, vous pouvez enregistrer le moment où ACTION_DOWN et le temps ACTION_UP, vous pouvez calculer si le temps est plus de 5 secondes entre ACTION_DOWN et ACTION_UP.

+1

OMI qui serait un usecase contre nature parce que nous attendons habituellement pour le menu contextuel ou toute modification avant de libérer le doigt, l'utilisateur ne compte généralement pas '1.2.3.4.5' puis relâchez. – Enzokie

1

Vous ne pouvez pas modifier le délai. Il est câblé dans le cadre android. Je suis également tombé sur le même problème il y a quelques jours. Vous pouvez utiliser setOnTouchListener manuellement pour cela.

Exemple:

private long then; 
private int longClickDur= 5000; //5 seconds 


//you can use any view you want 
ImageView imageView = (ImageView) findViewById(R.id.longclick_view); 
imageView.setOnTouchListener(new OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
     if (event.getAction() == MotionEvent.ACTION_DOWN) { 
      then = (long) System.currentTimeMillis(); 
     } else if (event.getAction() == MotionEvent.ACTION_UP) { 
      if ((System.currentTimeMillis() - then) > longClickDuration) { 
      /* Long click behaviour will go here*/ 
      Toast.makeText(context, "yay, long click", Toast.LENGTH.SHORT); 
      return false; 
      } else { 
      /* LONG CLICK FAILED*/ 
      Toast.makeText(context, "TRY AGAIN", Toast.LENGTH.SHORT); 
      return false; 
      } 
     } 
     return true; 
     } 
    }); 
+0

J'ai fait la même chose, mais dans ce cas, le défilement horizontal de listview ne se produit pas .... –

1

Cette réplique onLongPress plus précisément parce qu'elle n'attend pas l'utilisateur de lever le doigt avant d'exécuter. A été écrit spécifiquement pour ViewPager, mais devrait être capable d'appliquer une logique similaire.

// long press duration in milliseconds 
public static final int LONG_PRESS_DURATION = 2000; 

private boolean mIsTouching = false; 

@Override 
public boolean onTouchEvent(MotionEvent event) { 

    if (event.getAction() == event.ACTION_DOWN) { 
     mIsTouching = true; 
    } else if (event.getAction() == event.ACTION_UP) { 
     mIsTouching = false; 
    } 

    return super.onTouchEvent(event); 
} 

@Override 
public void onLongPress(MotionEvent event) { 

    // subtracts the system set timeout since that time has already occured at this point 
    int duration = LONG_PRESS_DURATION - getLongPressTimeout(); 

    Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      if (mIsTouching) { 
       do something... 
      } 
     } 
    }, duration > 0 ? duration : 0); 
} 
+0

Où est la méthode 'onLongPress (MotionEvent)'? Je ne peux pas le trouver dans 'ViewPager'. Voulez-vous dire 'onLongClick (View View)' dans 'View.OnLongClickListener'? –

+0

Merci. A fonctionné pour moi, bien que j'ai dû enlever le getLongPressTimeout() de votre solution. – TomV