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

时间:2013-03-12 19:10:33

标签: android android-webview contextual-action-bar

我想覆盖现有的默认上下文操作栏(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;
        }
    });

2 个答案:

答案 0 :(得分:9)

我能够解决这个问题。我也面临这个问题,在网上找不到任何解决方案。

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

我只是扩展了Webview类并重写了startRunMode方法,如下所示:

public ActionMode startActionMode(ActionMode.Callback callback) 
{
    actionModeCallback = new CustomizedSelectActionModeCallback();
    return super.startActionMode(actionModeCallback);
}

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

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

希望这有帮助。

答案 1 :(得分:1)

官方文档Selection | Android Developers指出:

  

选择CAB操作

     

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

     

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

不幸的是,报价中包含的链接链接到一个部分,该部分仅保存一般信息而不实际详细说明。更糟糕的是,它链接回Selection | Android Developers页面。

再往前看,我发现了Lars Vogel的this tutorial。我引用(格式化我的):

  

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

     

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

     

要实现此功能,请在View或on上调用startActionMode()方法   你的活动。这个方法得到一个ActionMode.Callback对象   负责上下文ActionBar的生命周期。

     

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

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