Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Android中覆盖文本选择(在WebView中)的默认上下文操作栏_Android_Android Webview_Contextual Action Bar - Fatal编程技术网

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

在Android中覆盖文本选择(在WebView中)的默认上下文操作栏,android,android-webview,contextual-action-bar,Android,Android Webview,Contextual Action Bar,我想覆盖现有的文本选择默认上下文操作栏(CAB)。我的意思是,当在webview上选择一些文本时,我想用我自己的按钮显示我自己的CAB。我尝试使用Android文档实现CAB。OnLongClickListener不会捕获web视图中的文本选择事件。捕获文本选择的事件是什么?是否可以隐藏默认CAB并在文本选择时显示我的CAB childWebView.setOnLongClickListener(new OnLongClickListener() { @Override

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

正式文件指出:

选择驾驶室动作

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

动态调整驾驶室动作 在大多数情况下,您需要根据需要动态调整驾驶室中的动作 用户将更多项目添加到选择中。适用于某个应用程序的操作 单个选定数据项不一定适用于多个选定数据项 同类数据项

不幸的是,报价中包含的链接链接到了一个部分,该部分也只包含一般信息,而没有实际详细说明。更糟糕的是,它会链接回页面

再看远一点,我从Lars Vogel那里找到了。我引用(我的):

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

上下文操作模式通常通过选择项目或长时间单击项目来激活

要实现这一点,请在视图或上调用
startActionMode(
)方法 你的活动。此方法获取一个
ActionMode.Callback
对象,该对象是 负责上下文
操作栏的生命周期

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


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

我已经能够解决此问题。我也面临着这个问题,在网上找不到任何解决办法

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

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

public ActionMode startActionMode(ActionMode.Callback callback) 
{
    actionModeCallback = new CustomizedSelectActionModeCallback();
    return super.startActionMode(actionModeCallback);
}
这迫使Webview显示我的回调,而不是显示Webview的默认回调。这确保了选择工作与以前一样顺利,每次选择时都会显示我的驾驶室。唯一需要注意的是,我必须自己编写代码来解雇出租车

在4.1、4.2和4.3设备上测试


希望这能有所帮助。

你找到了那个卡卡的解决方案吗?到目前为止有没有解决方案?我也在寻找解决方案。@matiash,创建新标签时请小心。我们已经有了Android上下文操作栏的标签。@Charles,对不起,你说得完全正确。我在重新记录一些问题时发现了它。这就是我停下来的原因。:/但是不是所有的android标签都应该有
android-
前缀吗?但是您无法从webview中获取所选文本。此外,在我的实现中,有时使用这种方法在Kitkat webview中会出现内部错误。@Frank您可以通过JavaScript(window.getSelection().toString())获取所选文本。我还没有在KitKat上试过,我会试着看看这个问题。你在4.4上有没有这样的运气?我也做了同样的事情,但是如果选择发生了任何变化,应用程序会在选择动作时崩溃。它在4.4上对我来说非常适合。此外,在4.4中,无需手动关闭驾驶室。它被Android自动隐藏。嘿,谢谢你。通过您的努力,我能够隐藏默认的CAB,但问题是webview上的文本选择(长时间单击)也消失了。您在上面对javascript的使用所做的评论只有在选中文本时才有帮助。在我的情况下,文本不会被选中,只需长按一下即可。谢谢