Android 3.x 仅 WebView 文本选择 + JavaScript
Posted
技术标签:
【中文标题】Android 3.x 仅 WebView 文本选择 + JavaScript【英文标题】:Android 3.x ONLY WebView Text Selection + JavaScript 【发布时间】:2011-10-20 09:04:48 【问题描述】:问题领域:基于android WebView的ePub格式阅读器--
我们需要可通过 javascript 方法访问的文本突出显示(即打开 em、关闭 em、保存它们并通过电子邮件发送等)
如果我错了,请知道的人纠正我: 在 WebView 上选择文本期间 --
基本上,我们得到了一个 TextView 叠加层(WebTextView),除了视觉上之外,它绝不会附加到底层 html 上(顺便说一句,将它全部对齐并使其无缝),我们在其上执行 TextSelectionActionMode 和ClipboardManager 提供了结果...为了清楚起见,在此库存过程中的任何时候都没有实际选择带有 WebView 的实际 HTML,这就是 JavaScript 无法访问操作结果的原因。
因此,为了使这种行为在 3.1+ 中起作用,我有一些可能的计划来在 WebView 上实现我自己的选择——这是我想知道我是否看不到角落的部分:) --
1) 捕获启动选择模式的长按的 MOTION_DOWN,覆盖内置的 TextSelection ActionMode( 以提供客户品牌 - 我发现这样做的方式太老套了) 观察拖动,捕获 MOTION_UP 位置,将这些坐标映射到 WebView,并根据坐标进行选择(同时将文本与 ClipboardManager 捕获的文本进行比较)
2) 创建我自己的“WebTextView”(整个工作大声笑),并且不那么 - hackishly 创建我自己的 ActionMode 并执行以上所有操作。
3) 使用选股过程生成的 MotionEvents 并以某种方式覆盖由此触发的股票 TextSelection ActionMode。
这些是我看到的选项,希望是我的接近和挫败感 有了这个让我看不到一个更简单的(读为内置的) 解决方案或两个。
再次感谢您的宝贵时间。
【问题讨论】:
【参考方案1】:我不能 100% 确定哪些方法/属性可以为您提供范围和选择。我在文档中没有看到任何内容。但我能够使用反射获得选定的像素范围。不确定这是否对任何人有帮助,但认为值得在这里发布。
Region result = null;
try
Object[] params = null;
Method nativeGetSelectionRegion = WebView.class.getDeclaredMethod("nativeGetSelectionRegion");
nativeGetSelectionRegion.setAccessible(true);
result = (Region)nativeGetSelectionRegion.invoke(this, params);
Log.i(TAG, "res: region " + result.getBounds().toShortString());
catch (Exception e)
e.printStackTrace();
希望对某人有所帮助
编辑:这不适用于 3.1+
【讨论】:
信任反射是痛苦的,至少可以说...信任 javascript 同样痛苦(据我所知,我的解决方案在 4.0 的 WebView 中被破坏,在我输入时处理“如何” ) 在 Javascript 中,document.getSelection() 返回 Selection 对象,您可以从中收集文档术语 developer.mozilla.org/en/DOM/window.getSelection 中的实际位置(它适用于文档或窗口界面)我不相信通过 Android 世界中的反射派生的任何东西;很简单,他们会打破它。话虽如此,如果 javascript 失败,这是一个不错的备份计划! 你是如何触发 document.getSelection() 的?我们最初尝试过,发现通过 loadUrl("javascript: document.getSelection()"); 加载 javascript导致选择被清除,所以那里什么都没有。 您需要使用 javascript 在 webview 中完成繁重的工作,并返回一个(在我的情况下)管道分隔的字符串以及您所追求的相关数据。即,使用 JavaScriptInterface 作为在 javascript 中生成的“扁平化”选择对象的接收器。此外,根据您对该数据的处理方式(我使用我的数据进行实时选择),请记住,必须将数据传递给 UI 线程(因为这很可能不会在 UI 线程上),所以处理程序模式可以,嗯,方便... 啊,重读你的帖子——这里有一个链接可以帮助你理解这个过程:***.com/questions/6240139/… 我们过去曾尝试在 javascript 中绑定鼠标向上事件,该事件将范围发送到 javascript 界面。该事件触发良好,直到屏幕上有一个选择。那时,看起来 webTextView 立即接管并且鼠标向上事件从未在 webView 中注册。我们必须支持回到 2.2,所以这可能就是原因。【参考方案2】:我在 2.2 - 4.0.3 中得到了这个工作。我使用了一个 javascript 界面并将所有内容传递给它。该解决方案似乎运行良好,我在 github 上放了一个示例项目。 github 项目在 assets 文件夹中包含必要的 js,以及一个测试页面和 Web 视图,用于加载测试页面并实现所有必要的方法来处理选择。 github项目的链接是https://github.com/btate/BTAndroidWebViewSelection。试试看。
【讨论】:
很好,由于加载大型 HTML 页面(特定于我们的应用程序)时速度下降,我无法使用各种 JS 库,所以我最终从头开始编写 js。 感谢您在 GitHub 上发布此内容,btate。 @btate 以上 github 项目不适用于 OS 版本 4.1 +。以上是关于Android 3.x 仅 WebView 文本选择 + JavaScript的主要内容,如果未能解决你的问题,请参考以下文章
Android webview +javascript 未在 android 4.0.x,3.x 中显示输出
如何从android中的webview获取所选部分的开始和结束位置
webview- window.getselection()值为null
Android 仅加载缓存不起作用。离线显示 WebView