覆盖Android中文本选择(在WebView中)的默认上下文操作栏

Posted

技术标签:

【中文标题】覆盖Android中文本选择(在WebView中)的默认上下文操作栏【英文标题】:Overriding the default Contextual Action Bar for text selection(in WebView) in Android 【发布时间】:2013-02-28 11:40:48 【问题描述】:

我想覆盖现有的默认上下文操作栏 (CAB) 以进行文本选择。我的意思是,当在 webview 上选择一些文本时,我想用我自己的按钮显示我自己的 CAB。我尝试使用 android 文档实现 CAB。 OnLongClickListener 不会捕获 Web 视图中的文本选择事件。捕获文本选择的事件是什么?是否可以隐藏默认 CAB 并在文本选择中显示我的 CAB?

childWebView.setOnLongClickListener(new OnLongClickListener() 
        @Override
     // Called when the user long-clicks on someView
        public boolean onLongClick(View view) 
            if (mActionMode != null) 
                return false;
            

            // Start the CAB using the ActionMode.Callback defined above
            mActionMode = startActionMode(mActionModeCallback);
            view.setSelected(true);
            return true;
        
    );

【问题讨论】:

你找到解决方法了吗? 到目前为止有什么解决办法吗? 我也在寻找解决方案。 @matiash,创建新标签时请小心。我们已经有了 Android 上下文操作栏的标签。 @Charles 对不起,你说得对。我在重新标记几个问题时发现了它。这就是我停下来的原因。 :/ 但是不应该所有的android标签都有android-前缀吗? 【参考方案1】:

我已经能够解决这个问题。我也遇到了这个问题,在网上找不到任何解决方案。

因此,如果您设置了 LongClick 侦听器,Webview 将完全停止显示选择。在深入研究Webview代码后,我发现它正在调用WebView的方法startRunMode并传递一个SelectActionCallbackMode类的实例。

我只是扩展了 Webview 类并像这样覆盖了 startRunMode 方法:

public ActionMode startActionMode(ActionMode.Callback callback) 

    actionModeCallback = new CustomizedSelectActionModeCallback();
    return super.startActionMode(actionModeCallback);

这迫使 Webview 显示我的回调,而不是显示 Webview 的默认回调。这确保了选择像以前一样顺利,每次选择时都会显示我的 CAB。唯一需要注意的是,我必须自己编写代码来解除 CAB。

在 4.1、4.2 和 4.3 设备上测试。

希望这会有所帮助。

【讨论】:

但是您无法从 web 视图中获取选定的文本。此外,在我的实现中,有时使用这种方法会在 Kitkat 网络视图中出现内部错误。 @Frank 你可以通过 javascript (window.getSelection().toString()) 获取选中的文本。我还没有在 KitKat 上尝试过,将尝试查看问题。 您在 4.4 上遇到过这个问题吗?我做了同样的事情,但如果选择完全改变,应用程序会在选择一个动作时崩溃。 它在 4.4 上非常适合我。此外,在 4.4 上,无需手动关闭 CAB。它会被 Android 自动隐藏。 嘿,谢谢 pulkit。通过您的努力,我能够隐藏默认 CAB,但问题是 webview(长按)上的文本选择也消失了。您在上面对 javascript 的使用所做的评论仅在选择文本时才有帮助。在我的情况下,文本根本没有被选中 onLongClick。谢谢【参考方案2】:

官方文档Selection | Android Developers指出:

选择 CAB 操作

您可以决定哪些动作和元素出现在 CAB 中。使用 Action Bar pattern 中的指南以决定要显示哪些项目 在顶层并且移动到动作溢出。

动态调整 CAB 操作 在大多数情况下,您需要动态调整 CAB 中的操作,如 用户将更多项目添加到选择中。适用于 a 的操作 单选数据项不一定适用于多选 同类数据项。

不幸的是,引用中包含的链接链接到的部分也仅包含一般信息而没有实际详细说明。更糟糕的是,它会链接回Selection | Android Developers 页面。

再看一点,我找到了来自 Lars Vogel 的this tutorial。我引用(格式化我的):

上下文操作模式会激活一个临时的ActionBar,它会在特定子任务期间覆盖应用程序ActionBar

上下文动作模式通常通过选择一个项目或长按它来激活。

要实现这一点,请在视图或视图上调用 startActionMode() 方法 你的活动。这个方法得到一个ActionMode.Callback 对象,它是 负责上下文ActionBar的生命周期。

您还可以通过 registerForContextMenu(view) 方法。上下文菜单也被激活 如果用户“长按”视图。 onCreateContextMenu() 方法 每次激活上下文菜单时都会调用上下文菜单 使用后被丢弃。您应该更喜欢上下文操作 上下文菜单的使用模式。

最突出的参考资料提到我们可以使用registerForContextMenu(view) 创建自己的菜单。我没有复制答案,而是通过J. Pablo Fernández 找到了this answer,其中包含有关如何应用您自己的CAB 的代码示例。注册一个新的上下文菜单应该覆盖任何默认菜单,但我不确定。由于我目前无法对此进行测试,因此很高兴知道这是否解决了您的问题。

【讨论】:

以上是关于覆盖Android中文本选择(在WebView中)的默认上下文操作栏的主要内容,如果未能解决你的问题,请参考以下文章

如何覆盖 webview 的文本选择上下文菜单?

在 Android WebView 中选择并突出显示文本

在Android的WebView中修改选择时文本选择菜单消失

Android:如何从 webview 中选择文本

android webview:防止文本选择actionMode actionBar

在失焦时隐藏文本选择句柄:Android -Webview