正文
void
onNoDoubleClick
(
View v
)
{
//something
}});
可是面临一个问题,有这么多,改到何年马月啊?
OK,这个是我以前碰到的一个好蛋疼的问题,再比如,在不侵入业务代码的情况下监听所有的点击事件并记录所有的点击数,用于统计热点页面和其他一些分析工作,你怎么办呢?现在介绍一个如何Hook掉View的onClick方法,相对与上一篇,这个很简单了。
1、第一步寻找Hook点:
去看setOnClickListener里面做了什么?
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
/**
* Register a callback to be invoked when this view is clicked. If this view is not
* clickable, it becomes clickable.
*
* @param l The callback that will run
*
* @see #setClickable(boolean)
*/public void setOnClickListener(@Nullable OnClickListener l) {
if (!isClickable()) {
setClickable(true);
}
getListenerInfo().mOnClickListener = l;
}
ListenerInfo getListenerInfo() {
if (mListenerInfo != null) {
return mListenerInfo;
}
mListenerInfo = new ListenerInfo();
return mListenerInfo;
}
2、开始HOOK
看完了上面,就能猜到我们设置的Listener最终是被赋值给ListenerInfo的mOnClickListener成员了,ListenerInfo的实例可以说是信息的载体,那么很简单,只要把mOnClickListener替换掉,在ListenerInfo中还有mOnLongClickListener,mOnFocusChangeListener两个成员,分别对应了长按事件与焦点变化事件,所以处理长按事件与焦点变化事件与此类似。
public class HookViewClickUtil {public static