文章内容来自https://www.jianshu.com/p/4f6d20076922
博客主要起到学习和记录的作用
直接贴代码了
private void hookOnClickListener(View view) {
try {
// 得到 View 的 ListenerInfo 对象
//得到getListenerInfo方法
Method getListenerInfo = View.class.getDeclaredMethod("getListenerInfo");
getListenerInfo.setAccessible(true);
//得到ListenerInfo变量
Object listenerInfo = getListenerInfo.invoke(view);
// 得到 原始的 OnClickListener 对象
//获取指定类
Class<?> listenerInfoClz = Class.forName("android.view.View$ListenerInfo");
//获取类中的变量
Field mOnClickListener = listenerInfoClz.getDeclaredField("mOnClickListener");
mOnClickListener.setAccessible(true);
View.OnClickListener originOnClickListener = (View.OnClickListener) mOnClickListener.get(listenerInfo);
// 用自定义的 OnClickListener 替换原始的 OnClickListener
View.OnClickListener hookedOnClickListener = new HookedOnClickListener(originOnClickListener);
mOnClickListener.set(listenerInfo, hookedOnClickListener);
} catch (Exception e) {
KLog.w("hook clickListener failed!", e);
}
}
class HookedOnClickListener implements View.OnClickListener {
private View.OnClickListener origin;
HookedOnClickListener(View.OnClickListener origin) {
this.origin = origin;
}
@Override
public void onClick(View v) {
Toast.makeText(FeedbackActivity.this, "hook click", Toast.LENGTH_SHORT).show();
KLog.i("Before click, do what you want to to.");
if (origin != null) {
origin.onClick(v);
}
KLog.i("After click, do what you want to to.");
}
}
使用
mTvQQ.setOnClickListener(this);
hookOnClickListener(mTvQQ);