Вопрос

Мне нужно реализовать 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));
            }
        });

    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top