Android 腾讯X5WebView如何禁止系统自带剪切板和自定义剪切板视图

css 复制代码
// 在页面开始加载时就注入的 JS(禁用右键和长按)
 
  private void injectDisableContextMenuJS(WebView view) {
        String earlyJs = "javascript:(function(){" +
                // 只禁用右键菜单和长按调用系统菜单
                "document.oncontextmenu = function(){return false;};" +
                // 不禁用选择,但要阻止系统默认行为
                "document.oncopy = function(e){" +
                "  e.preventDefault();" +
                "  return false;" +
                "};" +
                "document.oncut = function(e){" +
                "  e.preventDefault();" +
                "  return false;" +
                "};" +
                // 临时禁用 touch callout(长按菜单)
                "document.body.style.webkitTouchCallout = 'none';" +
                "})();";

        view.evaluateJavascript(earlyJs, null);
    }
css 复制代码
// 注入JS,监听selectionchange事件,把选中文本传给Java层
    private void injectSelectionJS() {

        // 关闭 X5 的长按菜单
        if (mWebView.getX5WebViewExtension() != null) {
            mWebView.getX5WebViewExtension().setLongPressTextExtensionMenu(1);
        }
       
        Strin js = "javascript:(function(){" +
                // 1. 禁用右键/长按菜单
                "document.oncontextmenu = function(){return false;};" +
                // 2. 禁止默认选中启动行为,阻止原生操作栏弹出
//                "document.onselectstart = function(){return false;};" +
                // 3. 禁止默认复制剪切行为
                "document.oncopy = function(){return false;};" +
                "document.oncut = function(){return false;};" +
                "document.onpaste = function(){return false;};" +

                // 4. 自定义选中文本背景色 + 禁用系统选中呼出菜单
                "var style = document.createElement('style');" +
                "style.innerHTML = " +
                "'*{" +
                "-webkit-touch-callout:none !important;" +  // 禁用系统长按菜单
                "-webkit-user-select:text !important;" +     // 允许文字选中
                "user-select:text !important;" +
                "}" +
                "::selection{background:#FFE082 !important; color:#000000 !important;}" +  // 选中背景色
                "::-moz-selection{background:#FFE082 !important; color:#000000 !important;}'; " +

                "document.head.appendChild(style);" +

                // 5. 自己监听选中变化,给安卓传值
                "document.onselectionchange = function(){" +
                "var sel = window.getSelection();" +
                "var text = sel.toString().trim();" +
                "if(text.length > 0){" +
                "var rect = sel.getRangeAt(0).getBoundingClientRect();" +
                "window.copyAndroid.copyToClipboard(text,rect.left, rect.top, rect.right, rect.bottom);" +
                "}else{" +
                "window.copyAndroid.copyToClipboard(text,0,0,0,0);" +
                "}" +
                "};" +
                "})();";


        mWebView.evaluateJavascript(js, null);
    }

onPageStarted 方法里面执行 injectDisableContextMenuJS这个方法。在onPageFinished 方法里面执行injectSelectionJS 方法。 Android 注入copyToClipboard方法 获取内容 跟位置。

java 复制代码
 其中 copyAndroid指的是
 mWebView.addJavascriptInterface(new WebViewInterfaceImpl(mContext), "copyAndroid");

Android 端注入copyToClipboard接收方法 获取相关位置坐标实现自定义视图

css 复制代码
 @JavascriptInterface
 @Override
 public void copyToClipboard(String text,float left,float top,float right,float bottom) {
   
 }
相关推荐
SL_staff2 分钟前
财务系统慎用低代码?从数据模型闭环看合规落地的技术实践
java·低代码·全栈
滕州市燕猫虎计算机科技工作室个体工商户10 分钟前
IDEA:Command line is too long
java·ide·intellij-idea
BoomHe22 分钟前
Android Framework 文件应用移植到 AndroidStudio
android
步行cgn41 分钟前
Spring p 命名空间注入详解
java·前端·spring
YatHinLay1 小时前
MyBatis 流式查询实战:ResultHandler 处理海量数据
java
天天被压力1 小时前
【跨市场数据实战 #08】可转债折价机会怎么筛:3个接口抓比价、列表和实时盘口
java·人工智能·python
张某布响丸辣2 小时前
附件下载的安全边界:路径白名单、NAS 哨兵文件与 Redis Lua 一次性令牌
java·redis·redis lua·nas哨兵
传奇开心果编程2 小时前
【Jetpack Compose基础语法学与练】第8课 rememberSaveable,页面旋转/系统重建保留状态
android·学习·ui·kotlin·android jetpack
>Andre<2 小时前
UFS5.0标准中文全译·卷一:范围、术语与架构
android·linux·嵌入式硬件
YatHinLay2 小时前
Spring Boot + Calcite 实现跨库查询
java