gpt4 book ai didi

android - 如何获取 View 的监听器

转载 作者:行者123 更新时间:2023-12-01 04:41:38 28 4
gpt4 key购买 nike

我编写与其他应用程序交互的服务。它在已经有监听器的 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com