2010-11-22 75 views
6

J'ai une activité qui implémente un détecteur de mouvement pour attraper l'entrée de l'utilisateur pour la navigation vers d'autres écrans. Cela fonctionnait bien - mais - j'ai récemment mis à jour une classe dérivée de BaseActivity pour ajouter une fonction onClick et maintenant que l'événement click semble bloquer l'onFling d'être frappé. Le onClick est lié à une zone TextView (dans un LinearLayout) que j'ai sur mon écran. La méthode resultsClick est connectée à TextView à l'aide de sa propriété onClick dans la présentation XML.Android onClick bloquant onFling

J'ai essayé de changer les valeurs de retour dans onSingleTapUp et onDown sans chance. J'ai également essayé d'ajouter des instructions de journal à toutes les fonctions ci-dessous. Aucun d'entre eux ne se déclenche lorsque je lance dans la zone TextView, mais ils le font sur d'autres zones de l'écran. Peut-être que j'utilise les mauvais termes de recherche, mais je n'ai pas réussi à trouver un exemple qui résout ce problème - mais je suis sûr que ce problème a déjà été résolu.

public class DerivedActivity extends BaseActivity 
{ 
    ... 
    /** 
    * resultsClick - The user clicked on the Results area 
    * @param v 
    */ 
    public void resultsClick(View v) 
    { 
     try 
     { 
     Log.i(this.toString(), "resultsClick"); 
     startActivity(new Intent(this, Results_TabHost.class)); 
     } 
     catch (Exception e) 
     { 
     Log.e(this.toString(), "Exception" + e.toString()); 
     } 

    }// end resultsClick 
    ... 
} 

Voici la classe de base qui implémente le code GestureListener

public class BaseActivity extends ActivityGroup 
          implements OnGestureListener 
{ 
    ... 
    private static final int SWIPE_MIN_DISTANCE = 120; 
    private static final int SWIPE_MAX_OFF_PATH = 250; 
    private static final int SWIPE_THRESHOLD_VELOCITY = 200; 

    public boolean onFling(MotionEvent e1, 
          MotionEvent e2, 
          float velocityX, 
          float velocityY) 
    { 
     try 
     { 
     Log.i(this.toString(), "onFling"); 

     // jump right out if not a swipe/fling 
     if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) 
     { 
      return false; 
     } 

     // right to left swipe 
     if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && 
      Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) 
     { 
      Log.i(this.toString(), "fling left"); 
      rightArrowClick(null); 

     } 
     else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && 
        Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) 
     { 
      Log.i(this.toString(), "fling right"); 
      leftArrowClick(null); 
     } 
     } 
     catch (Exception e) 
     { 
     Log.e(this.toString(), "Exception" + e.toString()); 
     } 

     return true; 

    }// end onFling 

    // These next methods we are required to have - even if unused - 
    // in order for the Gesture Handling to work 

    @Override 
    public boolean onTouchEvent(MotionEvent motionEvent) 
    { 
     return this.gestureDetector.onTouchEvent(motionEvent); 
    } 

    @Override 
    public void onLongPress(MotionEvent e) 
    { 
     // Intentionally not handling - must be overridden by listener class 
    } 

    @Override 
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) 
    { 
     // Intentionally not handling - must be overridden by listener class 
     // Intentionally returning true - per code examples 
     return true; 
    } 

    @Override 
    public void onShowPress(MotionEvent e) 
    { 
     // Intentionally not handling - must be overridden by listener class 
    } 

    @Override 
    public boolean onSingleTapUp(MotionEvent e) 
    { 
     // Intentionally not handling - must be overridden by listener class 
     // Intentionally returning true - per code examples 
     return true; 
    } 

    @Override 
    public boolean onDown(MotionEvent e) 
    { 
     // Intentionally not handling - must be overridden by listener class 
     // Intentionally returning true - per code examples 
     return true; 
    } 
... 
} 

Répondre

3

Votre implémentation de onTouchEvent est incorrect. Vous renvoyez simplement la valeur du résultat de gestureDector. Si votre détecteur de mouvements ne détecte aucun geste, vous dites à l'appelant «Je n'avais rien à faire ici» et l'événement tactile ne sera jamais envoyé aux enfants de l'activité. Vous devez appeler le super.onTouchEvent() si votre détecteur de mouvements n'a pas géré l'événement.

@Override 
public boolean onTouchEvent(MotionEvent motionEvent) 
{ 
    if(this.gestureDetector.onTouchEvent(motionEvent)) 
    { 
     return true; 
    } 
    //no gesture detected, let Activity handle touch event 
    return super.onTouchEvent(motionEvent); 
} 
+0

@CodeFusionMbile - merci pour votre suggestion. J'ai juste essayé de mettre à jour l'onTouchEvent en utilisant votre code ci-dessus, mais cela n'a fait aucune différence dans le comportement que je vois. J'ai ajouté un journal à chacun des événements gestuels pour être sûr. Lorsque je tente de glisser à travers l'écran, je vois le journal des résultats, mais je ne vois aucun des autres se connecter. – bursk

1

Vous pouvez simplement retourner false, lorsque rien n'est fait par votre code ... Il permettra au système d'événements de mouvement de tout gérer seul. Retour vrai, quand vous voulez arrêter l'événement pour être envoyé à d'autres Childs voir ..

3

S'il vous plaît prêter attention à cette fonction:

@Override 
    public boolean onDown(MotionEvent e) 
    { 
     // Intentionally not handling - must be overridden by listener class 
     // Intentionally returning true - per code examples 
     return true; 
    } 

changer la valeur S'il vous plaît de retour à false.