2009-06-11 14 views
0

J'ai besoin de mettre en œuvre OnLongClickListener pour la plate-forme BlackBerry.
Il peut être utilisé pour la saisie par l'utilisateur (mise en œuvre du clavier téléphonique) ou d'autres fonctionnalités (navigation, commande de rembobinage, contrôle du zoom, etc.). Il y a des exigences:BlackBerry LongClickListener mise en œuvre

  • contrôle cible pour écouter - ButtonField sur mesure
  • devrait être la version compiliant avec 4,5 et 4,6, donc pas touchEvents etc.
  • à long configurable clic temps

Do vous avez des suggestions sur le concept et la mise en œuvre?
En outre, quels problèmes je peux obtenir en utilisant plusieurs écouteurs pour le même champ?

Merci!

Répondre

1

Eh bien, juste un conseil simple. Override navigationClick et navigationUnclick - la tempête va cartographier automatiquement les presses sur l'écran pour ces événements. Vous devrez utiliser un Thread ou un Timer distinct pour chronométrer le clic. Il n'y a aucun moyen de le faire autrement (vous obtenez un paramètre de temps dans les deux événements, mais vous voulez que l'événement se déclenche avant le déclic).).

De même, vous devrez faire attention à ce qui se passe si l'utilisateur prononce un déclic puis clique à nouveau dans un intervalle de temps long. Vous voulez probablement recommencer la minuterie.

Les écouteurs multiples ne devraient pas fournir de difficulté - en supposant que n'importe quelle classe implémente l'écouteur est bien comportée (ne fait pas le traitement lourd dans la méthode de rappel). Généralement, les composants de l'interface utilisateur de BlackBerry peuvent avoir un maximum de 1 écouteur à la fois (c'est pourquoi il existe un setChangeListener au lieu de addChangeListener). À moins qu'il y ait une raison impérieuse d'emprunter la voie androïde avec plusieurs auditeurs, je m'en tiendrai à un seul - cela rendra l'implémentation un peu plus facile, et c'est cohérent avec le paradigme BB.

+0

Merci Anthony, grands conseils! –

2

J'ai suivi les conseils d'Anthony, implémentation en utilisant TimerTask et ButtonField.
Soyez prudent avec le style CONSUME_CLICK, en quelque sorte, excludes navigationClick event.
En outre, j'ai expiré problèmes avec les simulateurs Bold 9000/8900, navigationClick est déclenché après trackbar est non cliqué. Mais l'échantillon fonctionne bien avec Storm.

Interface:

public interface LongClickListener { 
    public void longClickEvent(Field field, int eventNumber); 
} 

contrôle lui-même:

public class LongClickButtonField extends ButtonField { 

    boolean mContinuousMode = false; 
    Timer mLongClickTimer = null; 

    long mLongClickDelay = 1000; 
    long mContinuousPeriod = 500; 
    LongClickListener mLongClickListener = null; 

    public LongClickButtonField(String label) { 
     super(label); 
    } 

    public LongClickButtonField(String label, boolean continuousMode) { 
     this(label); 
     mContinuousMode = continuousMode; 
    } 

    public void setLongClickListener(LongClickListener longClickListener) { 
     mLongClickListener = longClickListener; 
    } 

    protected boolean navigationClick(int status, int time) { 
     mLongClickTimer = new Timer(); 
     final Field eventArg = this; 
     if(!mContinuousMode) 
     { 
     mLongClickTimer.schedule(new TimerTask() {public void run() { 
      mLongClickListener.longClickEvent(eventArg, 0); 
     }}, mLongClickDelay); 
     } 
     else 
     { 
      mLongClickTimer.schedule(new TimerTask(){ 
       int eventNum= 0; 
       public void run() {    
       mLongClickListener.longClickEvent(eventArg, eventNum); 
       eventNum++; 
      }}, mLongClickDelay, mContinuousPeriod); 
     } 
     return true; 
    } 

    protected boolean navigationUnclick(int status, int time) { 
     mLongClickTimer.cancel(); 
     return true; 
    } 
} 

Utilisation:

public class Scr extends MainScreen implements LongClickListener { 
    LabelField mStatusLabel = new LabelField("status") { 
     protected void paint(Graphics graphics) { 
      graphics.setColor(Color.BLACK); 
      super.paint(graphics); 
     }; 
    }; 

    public Scr() { 
     LongClickButtonField button = new LongClickButtonField(
       "click & hold 5 s"); 
     LongClickButtonField buttonContinuous = new LongClickButtonField(
       "click & hold > 5 s", true); 
     button.setLongClickListener(this); 
     buttonContinuous.setLongClickListener(this); 
     add(mStatusLabel); 
     add(button); 
     add(buttonContinuous); 
    } 

    public void longClickEvent(final Field field, final int eventNumber) { 
     UiApplication.getUiApplication().invokeLater(new Runnable() { 
      public void run() { 
       mStatusLabel.setText( 
         ((ButtonField) field).getLabel() 
         + " event #" 
         + String.valueOf(eventNumber)); 
      } 
     }); 

    } 
} 
+0

@ MaxGontar..vous êtes génial ... !!! –