2012-09-06 2 views
1

J'utilise un numéroteur opensource que j'ai trouvé quelque part (merci à Jeffrey F. Cole) mais je viens de trouver un bogue.Détecter un événement tactile en dehors de la mise en page

Le numberpicker a un gestionnaire d'augmenter le nombre plus rapide lorsque vous appuyez sur le bouton

long`private Handler repeatUpdateHandler = new Handler(); 

`

class RepetetiveUpdater implements Runnable { 
    public void run() { 
     if (autoIncrement) { 
      increment(); 
      repeatUpdateHandler.postDelayed(new RepetetiveUpdater(), 
        REPEAT_DELAY); 
     } else if (autoDecrement) { 
      decrement(); 
      repeatUpdateHandler.postDelayed(new RepetetiveUpdater(), 
        REPEAT_DELAY); 
     } 
    } 
} 

..... 

public class NumberPicker extends LinearLayout { 

..... 

    // Auto increment for a long click 
    increment.setOnLongClickListener(new View.OnLongClickListener() { 
     public boolean onLongClick(View arg0) { 
      autoIncrement = true; 
      repeatUpdateHandler.post(new RepetetiveUpdater()); 
      return false; 
     } 
    }); 

    // When the button is released, if we're auto incrementing, stop 
    increment.setOnTouchListener(new View.OnTouchListener() { 
     public boolean onTouch(View v, MotionEvent event) { 
      if (event.getAction() == MotionEvent.ACTION_UP && autoIncrement) { 
       autoIncrement = false; 
      } 
      return false; 
     } 
    }); 

Le problème est quand vous longclick le bouton le compteur commence à augmenter, mais quand vous maintenez votre doigt vers le bas et faites glisser votre doigt sur l'écran, le compteur continue d'additionner, même lorsque vous levez votre doigt.

Alors comment puis-je détecter que le doigt sort de ma disposition numberpicker et arrêter le compteur?

Thx :)

Répondre

1

Je ne suis pas sûr que ce soit un bug et je ne suis même pas sûr que ça vient des changements que ce sélecteur de nombre fait au-dessus du numberpicker de l'API elle-même. Je suppose que les boutons qui gèrent l'incrémentation et la décrémentation des sélecteurs sont configurés pour continuer jusqu'à ce qu'un ACTION_UP MotionEvent soit reçu, mais cela peut le simplifier à l'extrême.

EDIT:

J'ai testé ce stock Android 2.3.3 et c'est précisément le résultat.

EDIT:

Sur la base de vos éclaircissements dans les commentaires, cela ne sonne comme un bug assez mauvais. On dirait que ce que vous devez faire est que le Handler supprime les callbacks dans ce script exécutable dans ACTION_UP. Pouvez-vous me lier au projet afin que je puisse essayer de soumettre un patch?

EDIT

Le NumberPicker que vous avez fourni n'a pas été correctement avec Handlers, l'OMI. Au lieu de conserver une référence au même gestionnaire pour que les rappels puissent être supprimés ultérieurement, il a été créé à chaque fois qu'il a été publié. J'ai fait quelques changements et j'ai réglé les problèmes ici: https://gist.github.com/3657989

+0

Oui, je comprends, mais le problème est que lorsque l'utilisateur lève son doigt n'importe où sur l'écran, le compteur continue d'additionner à moins que vous ne leviez votre doigt sur l'incrément bouton :) Si cela a du sens .. –

+0

@ just8laze merci pour la clarification. voir mon edit. – LuxuryMode

+0

Je l'ai trouvé ici, http://codejeff.com/?p=42, vous pouvez trouver le zip dans le deuxième commentaire. Les liens dans le message ne semblent plus fonctionner. –

Questions connexes