android - 如何获取 View 的监听器

标签 android listener

我编写与其他应用程序交互的服务。它在已经有监听器的 View (按钮、 TextView 等)上注册监听器。我需要用我自己的监听器(作品)替换它们,做一些事情,然后注销我的监听器并恢复旧的监听器。

  1. 带有带有 onClickListener 的按钮的应用正在运行
  2. 我的服务在 UI 线程内注册了一个 onClickListener + 执行某些操作
  3. 我的服务恢复旧的监听器

如果有一个 view.getOnClickListener 方法,那就很容易了。然后我可以保存旧的监听器并在完成后替换新的监听器。

是否有任何方法可以从 View 中获取监听器,或者将多个相同类型的监听器绑定(bind)到一个 View ?

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();

如果我将新的监听器注册到 View ,旧的监听器将被覆盖,对吗?如果两个监听器("new"和“旧”)同时存在也没关系。只是旧的不能消失。

编辑:不幸的是,我无法在分配时保存监听器。我需要从 View 组件向后获取它。

谢谢

最佳答案

感谢 mihail 的提示(谢谢你:)))使用隐藏 API,我找到了一个在分配后重新获取监听器的解决方案:

android.view.View 类有一个嵌套类static class ListenerInfo,它存储 View 上的所有监听器(API 14+)。在旧版本中,监听器是 android.view.View 中的私有(private)字段。

可以通过反射访问该字段。就我而言(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 listener
Field 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 的实例,该实例之前已匿名声明给 View 。它也适用于任何其他监听器,只需将“mOnClickListener 参数”替换为反射中所需的参数并正确转换即可。

请注意,即将发布的版本中的代码更改可能会使其不再起作用。

在这里找到最终教程:http://andwise.net/?p=161

关于android - 如何获取 View 的监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16422190/

相关文章:

c++ - 空覆盖 C++11

当重试策略设置为 0 时,Android Volley 向服务器发出 2 个请求

android - android中的自定义键盘 View

network-programming - 端口监听到底是什么

java - 向所有 Activity 全局添加/删除监听器

java - onCreate 中的监听器是否工作不止一次?

android - 我可以从手机中的网络浏览器发送感兴趣的广播接收器( native 应用程序)可以接收的 Intent 广播吗?

android - 像图书应用程序一样的操作栏

java - android studio 在将字符串添加到 textview 时给出不兼容的类型

android:按下完成键时软键盘执行 Action