Обнаружение сенсорного события вне макета

Я использую средство выбора номера с открытым исходным кодом, которое я где-то нашел (кредит Джеффри Ф. Коулу), но я только что нашел ошибку.

Устройство выбора номера имеет обработчик для увеличения номера быстрее, когда вы нажимаете кнопку

long`private Handler repeatUpdateHandler = new Handler();

`

    class RepetetiveUpdater implements Runnable {
    public void run() {
        if (autoIncrement) {
            increment();
            repeatUpdateHandler.postDelayed(new RepetetiveUpdater(),
                    REPEAT_DELAY);
        } else if (autoDecrement) {
            decrement();
            repeatUpdateHandler.postDelayed(new RepetetiveUpdater(),
                    REPEAT_DELAY);
        }
    }
}

 .....

public class NumberPicker extends LinearLayout {

 .....

    // Auto increment for a long click
    increment.setOnLongClickListener(new View.OnLongClickListener() {
        public boolean onLongClick(View arg0) {
            autoIncrement = true;
            repeatUpdateHandler.post(new RepetetiveUpdater());
            return false;
        }
    });

    // When the button is released, if we're auto incrementing, stop
    increment.setOnTouchListener(new View.OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_UP && autoIncrement) {
                autoIncrement = false;
            }
            return false;
        }
    });

Проблема в том, что когда вы долго нажимаете кнопку, счетчик начинает увеличиваться, но когда вы удерживаете палец и проводите пальцем по экрану, счетчик продолжает складываться, даже когда вы поднимаете палец.

Так, как я могу обнаружить, что палец выходит из моей схемы выбора номера и остановить счетчик?

Спасибо:)

1 ответ

Я не уверен, что это ошибка, и я даже не уверен, что это происходит из-за изменений, которые этот селектор чисел сделал поверх селектора чисел из самого API. Я предполагаю, что кнопки, которые обрабатывают увеличивающиеся и уменьшающиеся средства выбора, настроены так, чтобы продолжать работать до получения ACTION_UP MotionEvent, но это может быть слишком упрощено.

РЕДАКТИРОВАТЬ:

Я протестировал это на стоковой Android 2.3.3, и это именно тот результат.

РЕДАКТИРОВАТЬ:

Исходя из ваших разъяснений в комментариях, это звучит как довольно серьезная ошибка. Похоже, что вам нужно сделать, это чтобы обработчик удалял обратные вызовы для этого runnable в ACTION_UP. Можете ли вы связать меня с проектом, чтобы я мог отправить патч?

РЕДАКТИРОВАТЬ

Предоставленный вами NumberPicker не правильно использовал обработчики, IMO. Вместо того, чтобы хранить ссылку на тот же обработчик, чтобы впоследствии можно было удалить обратные вызовы, он создавал новый при каждой публикации. Я внес некоторые изменения и исправил проблемы здесь: https://gist.github.com/3657989

Другие вопросы по тегам