Android:禁用网页视图中的文本选择

Posted

技术标签:

【中文标题】Android:禁用网页视图中的文本选择【英文标题】:Android: Disable text selection in a webview 【发布时间】:2011-07-03 17:17:08 【问题描述】:

我正在使用 webview 在我的应用程序中呈现一些格式化的内容。对于某些交互(特定于某些 dom 元素),我使用 javascriptWebView.addJavascriptInterface()。现在,我想识别长触摸。不幸的是,onLongTouch,在 android 2.3 中显示了文本选择的句柄。

如何在不设置onTouchListener 的情况下关闭此文本选择 并返回true? (然后,与“网站”的交互就不再起作用了。

【问题讨论】:

对于那些想通过自定义View.OnTouchListener、see this related question 处理(例如禁用)所有触摸事件的人。 【参考方案1】:

这对我有用

mWebView.setOnLongClickListener(new OnLongClickListener() 
    @Override
    public boolean onLongClick(View v) 
        return true;
    
);
mWebView.setLongClickable(false);

我没测试过,如果不想长按引起的震动,可以试试这个:

mWebView.setHapticFeedbackEnabled(false);

【讨论】:

这仍然会产生轻微的振动(但没有上下文操作栏)。 mWebView.setLongClickable(false);没有什么不同,但是设置长点击监听器并从 onLongClick() 方法传递 true 对我有用。 这对我有用,但我不需要最后一行“mWebView.setLongClickable(false);” mWebView.setOnLongClickListener(v -> true); mWebView.setLongClickable(false); 这工作正常,但如果我们双击文本字段中的内容,选择和复制选项将被启用。如何禁用此功能?【参考方案2】:

将 webkit css 属性 -webkit-user-select 设置为 none 可以解决问题。

禁用选择的示例 CSS:

* 
   -webkit-user-select: none;

【讨论】:

这实际上是防止选择的最佳解决方案,因为它是跨平台的。 不幸的是,这不适用于所有版本的 Android。它应该是最好的解决方案,但它不是:/ *:not(input):not(textarea) webkit-user-select: none; 非常感谢,为了让它与 android 一起工作,我将其更改为 ' webkit-user-select: none;用户选择:无; '【参考方案3】:

我想通了!!这就是您可以实现自己的 longtouchlistener 的方式。在 longTouch 函数中,您可以调用您的 javascript 界面。

var touching = null;
$('selector').each(function() 
    this.addEventListener("touchstart", function(e) 
        e.preventDefault();
        touching = window.setTimeout(longTouch, 500, true);
    , false);
    this.addEventListener("touchend", function(e) 
        e.preventDefault();
        window.clearTimeout(touching);
    , false);
);

function longTouch(e) 
    // do something!

这行得通。

【讨论】:

我的问题仍然存在:touchstart 事件中的event.preventDefault() 调用也阻止了正常的光标模式输入/选择(在 html textinput 元素上)。 这是真的...也许关闭 android 层上的所有长触摸事件并删除 preventDefaults 是否有效? 这种行为让我感到困惑..为每个 onTouch 事件返回 true 似乎都有效,但是当我只选择某些(长)移动和向下事件以跳过进一步传播时,我会遇到一些状态,我在取消文本选择之前不要收到任何事件(例如)输入元素更改。文本选择似乎也在向下和(未来)向上事件之间触发。也许我错过了另一种可以取消的事件类型.. 我发现这会破坏浏览器中的任何滚动。例如,如果您将手指放在selector 元素上并尝试上下滚动,则不会发生任何事情。 @EMMERICH,我遇到了同样的问题,它打破了滚动。是否有任何解决方案可以防止以本机方式选择文本?【参考方案4】:

如果您使用过,通过长按剪切/粘贴似乎已关闭

    articleView.setWebChromeClient(new WebChromeClient()...)

见https://bugzilla.wikimedia.org/show_bug.cgi?id=31484

因此,如果您使用 setChromeClient 并且希望长按开始复制/粘贴,请执行以下操作:

    webView.setWebChromeClient(new WebChromeClient()

        [.... other overrides....]

        // @Override
        // https://bugzilla.wikimedia.org/show_bug.cgi?id=31484
        // If you DO NOT want to start selection by long click,
        // the remove this function
        // (All this is undocumented stuff...)
        public void onSelectionStart(WebView view) 
            // By default we cancel the selection again, thus disabling
            // text selection unless the chrome client supports it.
            // view.notifySelectDialogDismissed();
        

    );

【讨论】:

我需要在我的 web 视图中具有复制/粘贴功能。我使用 setWebChromeClient 使用 onProgressChanged 方法进行进度条更新。这禁用了复制/粘贴功能。添加 onSelectionStart 方法再次启用复制/粘贴。非常感谢这个隐藏的宝石! API中没有这个方法,你们在说什么? developer.android.com/reference/android/webkit/… 这也让我一头雾水,你说的是什么安卓系统? 他们指的是一个“隐藏”的 API 方法:bugzilla.wikimedia.org/show_bug.cgi?id=31484#c15 因此它没有出现在 WebChromeClient 类的 API 文档中。 此解决方法仅在 SDK 2.3.7 r1 之前有效。对于较新的 SDK,您不能使用 WebChromeClient 或不要在 2.3.x 手机上使用复制/粘贴。见grepcode.com/file/repository.grepcode.com/java/ext/… 和grepcode.com/file/repository.grepcode.com/java/ext/…【参考方案5】:

似乎唯一的选择是设置onTouchListener并编写自己的代码来检测长按。如果是长按则返回true,否则返回false

【讨论】:

但我也想在 javascript 中实现一个 longclick 监听器。通过覆盖 onTouchListener 我将关闭视图上的所有长时间点击。怎么会,不能关闭文本选择?我认为这是一件非常基本的事情。 知道了。试试这个:***.com/questions/923782/… 在android中似乎没有任何作用。 但安卓 4.4 默认选择也即将推出【参考方案6】:

另一种解决方案是将 WebView 子类化并覆盖 performLongClick,如下所示:

public class AdvanceWebView extends WebView 
   //Add constructors...
   @Override
   public boolean performLongClick() 
   return true;
   

【讨论】:

【参考方案7】:

对于 kotlin,我发现以下工作:

webView.isLongClickable = false

【讨论】:

以上是关于Android:禁用网页视图中的文本选择的主要内容,如果未能解决你的问题,请参考以下文章

如何在android中覆盖网页视图文本选择菜单

如何在android中的活动开始时禁用按钮的单击事件检查

更新列表视图中的单行以显示隐藏的文本视图

禁用 TextBox 样式中的文本选择

在 chrome/firefox 阅读视图上禁用文本选择

禁用网页的 Internet Explorer 11 阅读视图