Question

Je dois mettre en œuvre OnLongClickListener pour la plateforme BlackBerry.
Il peut être utilisé pour l'entrée utilisateur (clavier ex téléphone de mise en œuvre) ou d'autres fonctionnalités (navigation, retour rapide contrôle, commande de zoom, etc.). Il y a des exigences:

  • contrôle cible à écouter - ButtonField personnalisée
  • il devrait être la version compiliant avec 4,5 et 4,6, donc pas touchEvents etc.
  • LONGTEMPS clic configurable

Avez-vous des suggestions sur le concept et la mise en œuvre?
En outre, quelles sont les questions que je peux obtenir à l'aide d'écouteurs multiples pour un même champ?

Merci!

Était-ce utile?

La solution

Eh bien, des conseils simples. Remplacer navigationClick et navigationUnclick - la tempête assignera automatiquement les presses à l'écran pour ces événements.

Vous devez utiliser un thread séparé ou une minuterie pour réellement le temps le clic - il n'y a aucun moyen de faire autrement (vous obtenez un paramètre de temps dans les deux événements, mais vous voulez l'événement au feu avant la Décochez) .

vous devrez également faire attention à ce qui se passe si l'utilisateur dit unclicks et puis clique à nouveau dans la durée d'un long intervalle de clic. Probablement vous voulez commencer à nouveau la minuterie.

Plusieurs auditeurs ne devraient fournir aucune difficulté - en supposant que quelle que soit la classe implémente l'auditeur est bien comportés (ne fait pas de traitement lourd dans la méthode de rappel). En général, les composants de l'interface utilisateur BlackBerry peuvent avoir à un moment un maximum de 1 auditeur (c'est pourquoi il y a un setChangeListener au lieu de addChangeListener). À moins qu'il ya une raison impérieuse d'aller la route android avec plusieurs auditeurs, je bâton avec juste un -. Ça va faire la mise en œuvre un peu plus facile, et il est compatible avec le paradigme BB

Autres conseils

J'ai suivi des avis de Anthony, la mise en œuvre en utilisant TimerTask et ButtonField.
Soyez carfull avec le style CONSUME_CLICK, en quelque sorte, il exclut événement navigationClick .
Aussi, j'ai expirienced problèmes avec gras 9000/8900 simulateurs, navigationClick est tiré après est molette déclipsée . Mais l'échantillon fonctionne très 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));
            }
        });

    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top