gpt4 book ai didi

android - 如何获得 View 的监听器

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:36:20 26 4
gpt4 key购买 nike

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

  1. 正在运行带有 onClickListener 按钮的应用
  2. 我的服务在 UI-Thread 中注册了一个 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/14601729/

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