2016-09-01 5 views
0

J'ai un glisser-déposer. Si l'utilisateur touche l'élément, le OnTouchListenerLe OnLongClickListener ne fonctionne pas

code commence:

View.OnTouchListener dragListener = new View.OnTouchListener() { 
    @Override 
    public boolean onTouch(View view, MotionEvent motionEvent) { 
     // start move on a touch event 
     if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { 
      ClipData data = ClipData.newPlainText("", ""); 
      View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view); 
      view.startDrag(data, shadowBuilder, view, 0); 
      // API 24 
      // view.startDragAndDrop(data, shadowBuilder, view, View.DRAG_FLAG_GLOBAL); // API 24 
      view.setVisibility(View.VISIBLE); 
      return true; 
     } 
     return false; 
    } 
}; 

Mais j'aurais un OnLongClickListener sur mon code. Si l'élément a été prise (à long cliqué) par l'utilisateur, un message de pain grillé était spectacle sur l'écran:

homebutton.setOnLongClickListener(new OnLongClickListener() { 
public boolean onLongClick(View arg0) { 
    Toast.makeText(UserArea.this, "laaaange geklickt", Toast.LENGTH_SHORT).show(); 
    return true; 
} 
}); 

Mais il ne fonctionne pas :-(

+1

votre dargListener est également défini avec homeButton? si yer alors vous devriez retourner false de if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {return false;} condition – Rajendra

+0

désolé, je ne sais pas, ce que vous voulez dire par "dragListener est également réglé avec homebutton". :-( – SilverBlue

Répondre

1

Modifier votre événement tactile et basé sur le seuil, vous décidez de la tOUCHER ou long Press

private float mDownX; 
private float mDownY; 
private final float SCROLL_THRESHOLD = 10; 
private boolean isOnClick; 

@Override 
public boolean onTouchEvent(MotionEvent ev) { 
    switch (ev.getAction() & MotionEvent.ACTION_MASK) { 
     case MotionEvent.ACTION_DOWN: 
      mDownX = ev.getX(); 
      mDownY = ev.getY(); 
      isOnClick = true; 
      break; 
     case MotionEvent.ACTION_CANCEL: 
     case MotionEvent.ACTION_UP: 
      if (isOnClick) { 
       Log.i(LOG_TAG, "onClick "); 
       //TODO onClick code 
      } 
      break; 
     case MotionEvent.ACTION_MOVE: 
      if (isOnClick && (Math.abs(mDownX - ev.getX()) > SCROLL_THRESHOLD || Math.abs(mDownY - ev.getY()) > SCROLL_THRESHOLD)) { 
       Log.i(LOG_TAG, "movement detected"); 
       isOnClick = false; 
      } 
      break; 
     default: 
      break; 
    } 
    return true; 
} 
+0

Je reçois un er ror: "impossible de résoudre le symbole 'LOG_TAG' – SilverBlue

+0

C'est une variable String que vous devez définir private static final Chaîne LOG_TAG = surya

+0

private static final Chaîne LOG_TAG = UserArea;/Je reçois une erreur: Expression attendue :-("UserArea" est le nom de ma classe – SilverBlue

1

return false de votre auditeur

View.OnTouchListener dragListener = new View.OnTouchListener() { 
    @Override 
    public boolean onTouch(View view, MotionEvent motionEvent) { 
     //your logic 
     return false; 
    } 
}; 

sinon votre événement serait traité comme terminée

+0

Désolé, je ne comprends pas cela ... – SilverBlue

+0

findViewById (R.id.homebutton) .setOnTouchListener (dragListener); – SilverBlue

+0

après avoir manipulé l'onTouchEvent - vous revenez vrai, retourner true ne propagera plus l'événement tactile dans la hiérarchie, l'événement est traité comme étant consommé .Seulement, si vous renvoyez false, il propagera l'événement tactile – surya