我有两个实现 OnTouchListener 的不同对象。
其中之一,使用事件数据修改一些内部数据,另一个更新 UI。
问题是,如果我将它们都设置为监听同一个 View,只有其中一个处理 OnTouch 事件,另一个的 OnTouch 函数不会被调用。
我读到如果 OnTouch 函数返回 true,则意味着事件已被处理,但如果我返回 False,它们的行为不正常。
所以,问题是:
如何将两个或多个侦听器对象设置为来自视图的相同 OnTouch 事件,并允许它们全部接收所有这些事件?
我有两个实现 OnTouchListener 的不同对象。
其中之一,使用事件数据修改一些内部数据,另一个更新 UI。
问题是,如果我将它们都设置为监听同一个 View,只有其中一个处理 OnTouch 事件,另一个的 OnTouch 函数不会被调用。
我读到如果 OnTouch 函数返回 true,则意味着事件已被处理,但如果我返回 False,它们的行为不正常。
所以,问题是:
如何将两个或多个侦听器对象设置为来自视图的相同 OnTouch 事件,并允许它们全部接收所有这些事件?
只需让一个侦听器为两个对象调用一个方法:
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)
方法。
为什么你不能让监听器只指向 UI 活动,然后你可以从那个活动中调用任何更新内部数据的东西?我不认为让 2 个事件侦听器响应同一个事件是一个好主意,即使有可能(我对此表示怀疑)。想象一下,如果有人试图让 2 个 UI 活动响应 1 个事件以及它会导致的冲突。
我的解决方法是只有一个类 extendSimpleOnGestureListener
和 implement OnTouchListener
。一个类正在扩展SimpleOnGestureListener
,而另一个类正在实现OnTouchListener
,但两者都在处理触摸事件。
然后,我将较小类的所有代码(就代码行而言)移至较大的类,然后在我的实现中调用较大的类并且它起作用了。然后我这样宣布我的班级
public class MyOnlyListener extends SimpleOnGestureListener implements OnTouchListener
在 Kotlin 中,我这样做:
扩展 View,然后覆盖 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
}