implementazione di BlackBerry LongClickListener
-
13-09-2019 - |
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!
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));
}
});
}
}