如何钩入现有的事件监听器

3

我目前正在开发一个Java SDK,该SDK需要由原始开发人员安装到他现有的Android应用程序中。现在我需要设置一些事件监听器,例如:

public void registerTouchListener(ScrollView scrollview) {
  scrollview.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
      Log.d("SDK", event.toString());
      return false;
    }
  });
}

问题在于传入的ScrollView可能已经注册了一个监听器,因此我的问题是如何连接到现有的监听器或注册第二个监听器?

2
据我所知,答案是“你都不做”,因为没有监听器设置器的getter。 - CommonsWare
是的,我注意到了,但我仍然需要想办法实现我的想法的要点... 有什么建议吗? - electronix384128
为他们提供自己的API来提供ScrollView监听器,您可以自己实现组合模式,将事件转发给两个监听器。然后,详细记录这一点,以便开发人员知道您正在拥有触摸监听器,并且他们需要调用您的API而不是自己调用setOnTouchListener() - CommonsWare
是的,好主意;我也在考虑编写一个通过反射检查属性的轮询类,例如检查scrollY或其他东西 - 你对此有什么想法? - electronix384128
我不知道那是否能够很好地运作,抱歉。 - CommonsWare
2个回答

1
与其提供这样的API,不如提供一个函数,该函数将在事件结束(或开始)时直接调用onTouch。虽然它不会像初始化部分那样友好,但它会更清晰、更少出错。

1
也许有些hacky,但你是否可以通过检查触摸着陆的坐标并确认它是否在你注册的ScrollView列表中,从而在ScrollView接收到触摸事件之前“窃取”触摸事件。然后表现得好像你没有处理过触摸事件-这样你就可以在将触摸事件传递给ScrollView之前对其进行操作了?

1
是的,基本上现在我所做的就是获取原始的Listener,然后注册我的新Listener,并从其中调用原始Listener,例如在这里描述的方式:http://stackoverflow.com/questions/34609576/how-to-register-multiple-listeners-in-android?noredirect=1#comment56964298_34609576 和 https://dev59.com/xGgu5IYBdhLWcg3wpYYj#14993764。 - electronix384128

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接