美文网首页
关于 hookview 替代所有点击事件

关于 hookview 替代所有点击事件

作者: 细雨么么 | 来源:发表于2019-10-08 14:41 被阅读0次
    private void hookOnClickListener(View view) {
            try {
                // 得到 View 的 ListenerInfo 对象
                Method getListenerInfo = View.class.getDeclaredMethod("getListenerInfo");
                getListenerInfo.setAccessible(true);
                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) {
                log.warn("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(MainActivity.this, "hook click", Toast.LENGTH_SHORT).show();
                log.info("Before click, do what you want to to.");
                if (origin != null) {
                    origin.onClick(v);
                }
                log.info("After click, do what you want to to.");
            }
        }
    

    原文链接地址:
    https://www.cnblogs.com/linghu-java/p/9671230.html

    相关文章

      网友评论

          本文标题:关于 hookview 替代所有点击事件

          本文链接:https://www.haomeiwen.com/subject/ewubpctx.html