【问题标题】:Getting selected text in a WebView via a contextual action bar通过上下文操作栏在 WebView 中获取选定的文本
【发布时间】:2012-02-09 23:57:34
【问题描述】:

众所周知,difficult 在 WebView 中获取选定的文本,因为 WebView 文本选择实际上由私有类 WebTextView 处理。

然而,随着最近发布的Android 4.0 Design guidelines,似乎有一线希望通过上下文操作栏 (CAB) 实现这一目标。它says

只要您允许用户通过长按选择数据,就可以使用 CAB。您可以控制 CAB 的操作内容,以便插入您希望用户能够执行的操作。

我误解了吗? 有没有办法通过 CAB 从 WebView 中检索选定的文本?

长按并开始文本选择模式后,我目前可以检测ActionMode何时启动并修改原始复制/粘贴Menu;但是,我不太清楚如何实际检索选定的文本。

【问题讨论】:

  • 嘿@octopi,你能告诉我你是如何实际检测到 ActionMode 何时启动以及如何修改菜单的吗?我实现的是检测长按并自行启动 ActionMode,通过ActionMode.Callback 提供自定义栏,但不会显示文本选择光标。
  • @davids。不说选题,我也想知道怎么删改菜单。如果您不需要使用 ActionMode 除了文本选择,我有一个非常难看的解决方法。我覆盖了活动中的public ActionMode onWindowStartingActionMode (ActionMode.Callback callback)。说return super.onWindowStartingActionMode(new MyActionModeCallback());。它工作并且光标不会消失。但是,我不知道这种解决方法会导致什么副作用。我能想到这不是系统要我们做的。
  • @Yeung 我也需要覆盖操作栏但需要选择句柄
  • @Octopi 你能分享一下你是如何修改原始复制/粘贴菜单的吗?
  • 无法通过 Android 的 API 执行此操作。我们必须查看 Android Open Source Project 才能达到我们想要的效果。

标签: android webview android-actionbar android-4.0-ice-cream-sandwich


【解决方案1】:

目前的 API 还不能做到这一点。

我为此提交了功能请求 - 问题 24841:WebView 应允许应用程序提供自定义上下文操作栏 http://code.google.com/p/android/issues/detail?id=24841

基本上,4.0 中的 WebView 已经硬编码了自己的上下文操作栏 (CAB)。该 CAB 具有对 WebView 的引用,并且通过该引用,它可以获取选定的文本。我不确定你是如何检测到 ActionMode 启动和修改菜单的,但如果你能够做到所有这些,那么你就会被卡住,因为 getSelection() 目前是包私有的。我将其作为一个单独的问题提交,并将其链接到上面的上一个问题。

【讨论】:

  • 仍然无法解决这个问题?
【解决方案2】:

可以使用javascript获取选中的文本:window.getSelection(),并使用WebView的addJavascriptInterface函数返回结果。

【讨论】:

  • @johnnoodles 你确定吗?我目前使用类似以下的方法来获取 WebView 中的选定文本:wvWebView.loadUrl("javascript:if0.textOut(document.getSelection().toString());"); 其中if0 是一个带有方法textOut(String s) 的JavascriptInterface。它对我来说很好(尽管我还有其他问题) - 这会破坏我错过的某些请求功能吗?这个方法是不是严格通过CAB的问题?
【解决方案3】:

感谢您的信息,我已经解决了一个难题.. 我只想在动作模式中添加一些功能。 以下是我的代码,可能对其他人有帮助。

@Override
public ActionMode onWindowStartingActionMode(Callback callback) {
    // TODO Auto-generated method stub
    ActionMode mode = super.onWindowStartingActionMode(callback);
    mode.getMenuInflater().inflate(R.menu.actions, mode.getMenu());
    mode.getMenu().findItem(R.id.action_add).setOnMenuItemClickListener(new OnMenuItemClickListener() {

        @Override
        public boolean onMenuItemClick(MenuItem item) {
            // TODO Auto-generated method stub
            Log.i("", "onMenuItemClick add ");
            return false;
        }
    });
    return mode;
}

【讨论】:

  • Wing Chen,答案断章取义。请阅读实际问题。
猜你喜欢
  • 2014-04-15
  • 2013-02-28
  • 2012-05-25
  • 1970-01-01
  • 1970-01-01
  • 2013-07-12
  • 1970-01-01
  • 2012-05-17
  • 1970-01-01
相关资源
最近更新 更多