Как разрешить нескольким слушателям обрабатывать одни и те же события OnTouch в Android?

У меня есть два разных объекта, которые реализуют OnTouchListener.

Один из них использует данные события для изменения некоторых внутренних данных, а другой обновляет пользовательский интерфейс.

Проблема в том, что если я настрою их обоих на прослушивание одного и того же представления, только один из них обрабатывает событие OnTouch, а функция OnTouch другого не вызывается.

Я прочитал, что если функция OnTouch возвращает true, это означает, что событие было обработано, но если я верну False, они не будут вести себя должным образом.

Итак, вопрос в следующем:

Как я могу установить два или более объекта слушателя на одни и те же события OnTouch из View и позволить им всем получать все эти события?

3 ответа

Решение

Просто попросите одного слушателя вызвать метод для обоих объектов:

Object uiModifier;
Object internalDataModifier;
//ensure these Objects are initialized

myView.setOnClickListener(new OnTouchListener() {
    @Override
    public boolean onTouchListener(View v, MotionEvent event)
    {
        internalDataModifier.handleTouch(v, event);
        uiModifier.handleTouch(v, event);
        return true;
    }

}

и убедитесь, что оба internalDataModifier а также uiModifier иметь handleTouch(View, MotionEvent) метод.

Почему вы не можете заставить слушателя указывать только на действие пользовательского интерфейса, а затем из этого действия вы можете вызвать все, что обновляет внутренние данные? Я не думаю, что иметь двух слушателей, отвечающих на одно и то же событие, - хорошая идея, даже если это возможно (в чем я сомневаюсь). Представьте себе, если бы кто-то пытался выполнить 2 действия пользовательского интерфейса в ответ на одно событие и столкновения, которые оно может вызвать.

Мой обходной путь для этого должен был иметь только одно продление класса SimpleOnGestureListener и реализовать OnTouchListener, Один класс расширялся SimpleOnGestureListener в то время как другой класс реализовывал OnTouchListener но оба обрабатывали сенсорные события.

Затем я переместил весь код для меньшего класса (с точки зрения строк кода) в больший класс, затем вызвал больший класс в моей реализации, и это сработало. Затем я объявил свой класс так

    public class MyOnlyListener extends SimpleOnGestureListener implements OnTouchListener

Для справки я использовал один класс для масштабирования изображения (большой класс), в то время как другой использовал для перехода к следующей странице в представлении.

В Котлине я делаю так:

расширите представление, затем переопределите setOnTouchListener, затем вызовите super.setOnTouchListener и передайте инициализированный объект прослушивателя.

Снайперы:

var customOnTouchListener: OnTouchListener? = OnTouchListener { v, event ->
    return@OnTouchListener false
}

override fun setOnTouchListener(l: OnTouchListener?) {
    val bridgeListener = OnTouchListener { v, event ->
        // Listener 2
        customOnTouchListener?.onTouch(v, event)

        // Listener 1
        l?.onTouch(v, event) ?: false
    }

    super.setOnTouchListener(bridgeListener)
}

тогда я использую это так:

customScrollView.setOnTouchListener { v, event -> 
    // Got the event
}
customScrollView.customOnTouchListener = View.OnTouchListener { v, event ->
    // Got the event too
}
Другие вопросы по тегам