【问题标题】:How to add highlight option to Android Webview menu?如何在 Android Webview 菜单中添加高亮选项?
【发布时间】:2021-06-16 14:20:57
【问题描述】:

我正在从文本字符串中加载我的 Webview,如下所示:

String encodedHtml = Base64.encodeToString(unencodedHtml.getBytes(), Base64.NO_PADDING);
webview.loadData(encodedHtml, "text/html", "base64");
WebSettings webSettings = webview.getSettings();
webSettings.setJavaScriptEnabled(true);

当用户长按一个单词时,我想在 菜单 中添加一个颜色 Highlight 选项。我在 StackOverflow 上搜索了许多其他类似的问题,但没有成功。您对一些示例代码的帮助将不胜感激。提前致谢!

更新: 我正在使用这个脚本来突出显示:

public static String HighlightScript = "<script language=\"javascript\">" +
        "function highlightSelection(){" +
        "var userSelection = window.getSelection();" +
        "for(var i = 0; i < userSelection.rangeCount; i++)"
        + "  highlightRange(userSelection.getRangeAt(i));" +
        "}" +
        "function highlightRange(range){"+
        "span = document.createElement(\"span\");"+
        "span.appendChild(range.extractContents());"+
        "span.setAttribute(\"style\",\"display:inline;background:#ffc570;\");"+
        "range.insertNode(span);}"+
        "</script> ";

【问题讨论】:

标签: java android webview


【解决方案1】:

基于这个Calculate Position of selected text javascript/JQuery?调用WebView的evulatejavascript来获取开始结束值

objWebView.evaluateJavascript("(function(){var start = 0, end = 0;\n" +
                                        "    var sel, range, priorRange;\n" +
                                        "    if (typeof window.getSelection != \"undefined\") {\n" +
                                        "        range = window.getSelection().getRangeAt(0);\n" +
                                        "        priorRange = range.cloneRange();\n" +
                                        "        priorRange.selectNodeContents(document.body);\n" +
                                        "        priorRange.setEnd(range.startContainer, range.startOffset);\n" +
                                        "        start = priorRange.toString().length;\n" +
                                        "        end = start + range.toString().length;\n" +
                                        "    } else if (typeof document.selection != \"undefined\" &&\n" +
                                        "            (sel = document.selection).type != \"Control\") {\n" +
                                        "        range = sel.createRange();\n" +
                                        "        priorRange = document.body.createTextRange();\n" +
                                        "        priorRange.moveToElementText(document.body);\n" +
                                        "        priorRange.setEndPoint(\"EndToStart\", range);\n" +
                                        "        start = priorRange.text.length;\n" +
                                        "        end = start + range.text.length;\n" +
                                        "    }\n" +
                                        "        console.log(\"Selection starts at: \" + start);\n" +
                                        "        console.log(\"Selection ends at: \" + end);\n" +
    
    
                                        "    return {\n" +
                                        "        start: start,\n" +
                                        "        end: end\n" +
                                        "    };})()",
                                new ValueCallback<String>()
                                {
                                    @Override
                                    public void onReceiveValue(String value)
                                    {
                                        Log.v(TAG, "Webview selected text: " + value);
                                    }
                                });

一旦您在数据库中保存了范围值。调用相同的方法来突出显示(仅在 WebView 加载完页面后才有效

    objWebView.loadDataWithBaseURL(null, yourstringobject, "text/html; charset=UTF-8", "UTF-8",
                        null);
                objWebView.post(new Runnable() {
                    @Override
                    public void run() {
     //here you can have logic to fetch the data from database and loop to update                   
objWebView.evaluateJavascript("javascript:selectAndHighlightRange('Amod', 250, 274)", null);
                    }
            });

【讨论】:

  • 效果很好,阿莫德!非常感谢您的代码!现在,我只有一件事需要你的帮助。我会将此范围值保存在本地 SQLite 数据库中以便稍后检索它。检索范围后,如何在文本上突出显示它?再次感谢您的帮助!
  • 我已经用我用来突出显示的脚本更新了我的问题。我只是不确定如何传递“范围”对象。感谢您的帮助!
  • @neowinston 看起来像您编写的方法突出显示用户选择的任何内容(windows.selection)。该方法需要更新以获取输入参数。我用过这个stackoverflow.com/questions/6240139/… 并且工作正常。我不太确定如何更新您的方法。我想这应该是一个针对 jscript 的单独问题
  • 谢谢!你帮了我很多,我会继续研究如何再次突出它。
  • @neowinston - 欢迎......如果您找到更好/更简单的替代方案,请更新您的问题
猜你喜欢
  • 2012-01-08
  • 1970-01-01
  • 1970-01-01
  • 2013-08-07
  • 1970-01-01
  • 2013-03-19
  • 1970-01-01
  • 2021-11-27
  • 2020-06-07
相关资源
最近更新 更多