3

我有两个实现 OnTouchListener 的不同对象。

其中之一,使用事件数据修改一些内部数据,另一个更新 UI。

问题是,如果我将它们都设置为监听同一个 View,只有其中一个处理 OnTouch 事件,另一个的 OnTouch 函数不会被调用。

我读到如果 OnTouch 函数返回 true,则意味着事件已被处理,但如果我返回 False,它们的行为不正常。

所以,问题是:

如何将两个或多个侦听器对象设置为来自视图的相同 OnTouch 事件,并允许它们全部接收所有这些事件?

4

4 回答 4

4

只需让一个侦听器为两个对象调用一个方法:

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)方法。

于 2012-10-28T19:27:51.707 回答
0

为什么你不能让监听器只指向 UI 活动,然后你可以从那个活动中调用任何更新内部数据的东西?我不认为让 2 个事件侦听器响应同一个事件是一个好主意,即使有可能(我对此表示怀疑)。想象一下,如果有人试图让 2 个 UI 活动响应 1 个事件以及它会导致的冲突。

于 2012-10-28T19:15:25.900 回答
0

我的解决方法是只有一个类 extendSimpleOnGestureListener和 implement OnTouchListener。一个类正在扩展SimpleOnGestureListener,而另一个类正在实现OnTouchListener,但两者都在处理触摸事件。

然后,我将较小类的所有代码(就代码行而言)移至较大的类,然后在我的实现中调用较大的类并且它起作用了。然后我这样宣布我的班级

    public class MyOnlyListener extends SimpleOnGestureListener implements OnTouchListener

作为参考,我使用一个类来平移缩放图像(较大的类),而我使用另一个类滑动到视图中的下一页。

于 2013-07-26T15:17:18.667 回答
0

在 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
}
于 2020-06-26T03:07:02.473 回答