Domanda

Ho bisogno di attuare OnLongClickListener per la piattaforma BlackBerry.
Può essere usato per l'input dell'utente (ad esempio telefono implementazione tastiera) o altre funzionalità (navigazione, riavvolgere il controllo, il controllo dello zoom, ecc). Ci sono requisiti:

  • controllo di destinazione per ascoltare - personalizzato ButtonField
  • dovrebbe essere la versione compiliant con 4.5 e 4.6, quindi non touchEvents ecc
  • configurabile molto tempo click

Hai qualche suggerimento circa il concetto e l'attuazione?
Inoltre, quali sono le questioni che posso ottenere nel usando più listener per lo stesso campo?

Grazie!

È stato utile?

Soluzione

Bene, proprio consiglio semplice. Override navigationClick e navigationUnclick - la tempesta mapperà automaticamente presse sullo schermo per questi eventi.

Dovrete usare un thread separato o un timer in realtà il tempo lo scatto - non c'è modo di farlo altrimenti (è possibile prendere un parametro temporale in entrambi gli eventi, ma si desidera che l'evento al fuoco prima della deselezionare) .

Inoltre dovrete stare attenti a quello che succede se l'utente dire unclicks e quindi fa clic di nuovo nel giro di un lungo intervallo clic. Probabilmente si desidera avviare di nuovo il timer.

ascoltatori multipli non devono fornire alcuna difficoltà - partendo dal presupposto che qualunque classe implementa l'ascoltatore è ben educati (non fare l'elaborazione pesante all'interno del metodo di callback). Generalmente i componenti dell'interfaccia utente BlackBerry possono avere un massimo di 1 ascoltatore alla volta (è per questo che c'è un setChangeListener invece di addChangeListener). A meno che non ci sia un motivo valido per andare via androide con più listener, mi piacerebbe restare con un solo -. Ti farà realizzazione un po 'più facile, ed è coerente con il paradigma BB

Altri suggerimenti

Ho seguito i consigli di Anthony, implementazione utilizzando TimerTask e ButtonField.
Essere carfull con stile CONSUME_CLICK, in qualche modo esclude evento navigationClick .
Inoltre, ho problemi con expirienced Bold 9000/8900 simulatori, navigationClick viene licenziato dopo rotellina è unclicked . Ma di esempio funziona bene con Storm.

Interfaccia:

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

Controllo stessa:

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;
    }
}

Usa:

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));
            }
        });

    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top