Реализация BlackBerry LongClickListener
-
13-09-2019 - |
Вопрос
Мне нужно реализовать OnLongClickListener Онлайн-кликлистенер для платформы BlackBerry.
Он может использоваться для пользовательского ввода (например, с клавиатуры телефона) или других функциональных возможностей (навигация, управление перемоткой назад, масштабирование и т.д.).Есть требования:
- целевой элемент управления для прослушивания - пользовательское поле кнопок
- это должна быть компилятивная версия с 4.5 и 4.6, так что никаких TouchEvents и т.д.
- настраиваемое длительное время щелчка
Есть ли у вас какие-то предложения по поводу концепции и реализации?
Кроме того, какие проблемы я могу получить при использовании нескольких прослушивателей для одного и того же поля?
Спасибо!
Решение
Ну, просто прямой совет.Переопределите navigationClick и navigationUnclick - шторм автоматически сопоставит нажатия на экране с этими событиями.
Вам придется использовать отдельный поток или таймер, чтобы фактически засечь время щелчка - иначе это невозможно сделать (вы получаете параметр time в обоих событиях, но вы хотите, чтобы событие сработало до отмены щелчка).
Также вам нужно быть осторожным с тем, что произойдет, если пользователь, скажем, снимет клик, а затем нажмет еще раз в течение длительного интервала кликов.Вероятно, вы хотите снова запустить таймер.
Несколько прослушивателей не должны создавать никаких трудностей - при условии, что любой класс, реализующий прослушиватель, ведет себя хорошо (не выполняет интенсивную обработку в методе обратного вызова).Обычно компоненты пользовательского интерфейса BlackBerry могут иметь максимум 1 прослушиватель одновременно (вот почему вместо addChangeListener используется setChangeListener).Если нет веской причины использовать Android с несколькими прослушивателями, я бы остановился только на одном - это немного упростит реализацию и согласуется с парадигмой BB.
Другие советы
Я последовал советам Энтони, реализация с использованием Временная задача и Баттонфилд.
Будьте аккуратны со стилем CONSUME_CLICK, каким-то образом это исключает событие navigationClick.
Кроме того, у меня возникли проблемы с симуляторами Bold 9000/8900, navigationClick запускается после того, как trackwheel незакрытый.Но сэмпл прекрасно работает со Storm.
Интерфейс:
public interface LongClickListener {
public void longClickEvent(Field field, int eventNumber);
}
Контролировать себя:
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;
}
}
Использование:
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));
}
});
}
}