27

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

2 回答 2

9

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

因此,如果您设置了 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 设备上测试。

希望这可以帮助。

于 2014-02-07T11:33:07.500 回答
1

官方文档选择 | Android 开发人员指出:

选择 CAB 操作

您可以决定哪些动作和元素出现在 CAB 中。使用操作栏模式中的指南来决定哪些项目要显示在顶层,哪些项目要移动到操作溢出。

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

不幸的是,引用中包含的链接链接到一个部分,该部分也只包含一般信息而没有实际进入细节。更糟糕的是,它链接回选择 | Android 开发者页面。

再看一点,我从 Lars Vogel那里找到了这个教程。我引用(格式化我的):

上下文操作模式激活一个临时ActionBar覆盖应用程序ActionBar的特定子任务的持续时间。

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

startActionMode(要实现这一点,请在View 或您的 Activity 上调用) 方法。此方法获取一个ActionMode.Callback负责上下文生命周期的对象ActionBar

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

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

于 2013-08-23T11:27:08.213 回答