我正在使用 android webview 构建一个小型浏览器应用程序,并且我一直在 javascript 中使用 window.getSelection()
来获取用户选择的任何文本的性质并显示自定义上下文基于选择类型的菜单,即是否是范围、克拉、是否在可内容编辑等中。
除非选择位于 iframe 中,否则这种方法工作正常,然后浏览器安全措施就会启动并阻止我使用 window.getSelection()
嗅探所选择的内容。我该如何解决这个问题?
理想情况下,我需要一种方法来获取有关从 Web View 中选择的内容的更好信息,或者如果不可能,我需要一种方法来嗅探选择是否发生在 iframe 中,以便我可以禁用自定义上下文菜单逻辑并回退到默认 Android 上下文菜单。
更新/进一步说明 2019 年 7 月 5 日:
看来我最初的描述不够清楚......
我的目标是在 Web View 中选择内容时拥有一个视觉上和功能上的自定义菜单,可以像标准上下文菜单在页面/iframe 等的任何部分中那样剪切/复制/粘贴。例如
我意识到我原来使用 JavaScript 来检测选择类型并执行剪切/复制/粘贴的方法是错误的,因为它会被 iframe 中的跨源安全性阻止。
我需要的是一种基于原生 android/webview 的方法。我发现我可以通过查看 onActionModeStarted
上的 mode.getMenu()
中的项目来嗅探 Web View 中的选择类型。这将使我能够在自定义菜单 UI 中显示正确的按钮,但我无法手动触发单击剪切/复制/粘贴时调用的相同逻辑。我以为我找到了 webView.performAccessibilityAction(AccessibilityNodeInfo.ACTION_CUT, null);
的解决方案,但这由于某种原因不起作用,所以我想我的问题实际上是如何手动触发剪切/复制/不使用 javascript 粘贴从 webview 中选择的文本?或者任何其他方法可以让我拥有一个自定义选择菜单,其中包含基于所选内容的大量选项,而不会遇到浏览器安全限制?
最佳答案
好吧,我大概知道如何做到这一点。
第 1 步)在您的 Activity 中,覆盖 onActionModeStarted
并检查默认上下文菜单中可用的菜单项。这为您提供了有关选择类型是什么以及需要在自定义菜单中显示哪些按钮的线索。它还为您提供了对项目 ID 的引用,您可以稍后使用它来触发操作,例如
systemSelectionMenu = mode.getMenu(); // keep a reference to the menu
MenuItem copyItem = systemSelectionMenu.getItem(0); // fetch any menu items you want
copyActionId = copyItem.getItemId(); // store reference to each item you want to manually trigger
第 2 步)不要清除菜单,而是使用 setVisible()
隐藏您想要自定义按钮的每个菜单项,例如
copyItem.setVisible(false);
第 3 步)在自定义按钮 onclick 事件中,您可以使用以下方法触发复制操作:
myActivity.systemSelectionMenu.performIdentifierAction(myActivity.copyActionId, 0)
关于android - 在android webview中手动触发剪切/复制/粘贴,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55868065/