Как разрешить нескольким слушателям обрабатывать одни и те же события 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
}