
我编写与其他应用程序交互的服务.它在已有侦听器的视图(按钮,textvIEws,…)上注册侦听器.我需要用我自己的听众(作品)替换它们,做一些事情然后取消注册我的听众并恢复旧听众.
>带有onClickListener按钮的应用程序正在运行
>我的服务在UI-Thread内部注册一个onClickListener
>我的服务恢复了旧的监听器
如果有vIEw.getonClickListener -method,那将很容易.然后我可以保存旧的并在我完成后替换新的听众.
有没有办法从视图中获取侦听器,或者有多个绑定到一个视图的同一类型的侦听器?
button btn = (button) findVIEwByID(R.ID.btn1);btn.setonClickListener(new OnClickListener() { public voID onClick(VIEw v) { //do something } });// I need to do, but found no solution for that.VIEw.OnClickListener oldListener = btn.getonClickListener();如果我将新的侦听器注册到视图中,那么旧的侦听器会被覆盖,对吧?如果两个听众(“新”和“旧”)同时存在也没关系.只有旧的一定不能消失.
编辑:不幸的是我没有可能在分配时保存监听器.我需要从视图组件向后移动它.
谢谢
解决方法:
感谢mihail的提示(感谢:) :))使用隐藏的API,我找到了一个解决方案,在分配后获得一个监听器:
androID.vIEw.VIEw类有一个嵌套类静态类ListenerInfo,它存储VIEw上的所有侦听器(API 14).在旧版本中,侦听器是androID.vIEw.VIEw中的私有字段.
可以使用反射访问该字段.就我而言(API 14),
// get the nested class `androID.vIEw.VIEw$ListenerInfo`FIEld ListenerInfoFIEld = null;ListenerInfoFIEld = Class.forname("androID.vIEw.VIEw").getDeclaredFIEld("mListenerInfo");if (ListenerInfoFIEld != null) { ListenerInfoFIEld.setAccessible(true);}Object myliObject = null;myliObject = ListenerInfoFIEld.get(myVIEwObj);// get the fIEld mOnClickListener, that holds the Listener and cast it to a ListenerFIEld ListenerFIEld = null;ListenerFIEld = Class.forname("androID.vIEw.VIEw$ListenerInfo").getDeclaredFIEld("mOnClickListener")if (ListenerFIEld != null && myliObject != null) { VIEw.OnClickListener myListener = (VIEw.OnClickListener) ListenerFIEld.get(myliObject);}在那段代码之后(我错过了很多try-catch-blocks),myListener对象保存了onClickListener的实例,该实例之前已经匿名声明给了视图.它也适用于任何其他侦听器,只需将“mOnClickListener参数”替换为您在反射中所需的那个并正确投射它.
请注意,即将发布的版本中的代码更改可能会使其不再起作用.
在这里找到最终的教程:http://andwise.net/?p=161
总结以上是内存溢出为你收集整理的android – 如何获取视图的监听器全部内容,希望文章能够帮你解决android – 如何获取视图的监听器所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)