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

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

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

【问题讨论】:

  • 对于那些想通过自定义View.OnTouchListenersee this related question 处理(例如禁用)所有触摸事件的人。

标签: android webview


【解决方案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();
        }

    });

【讨论】:

【解决方案5】:

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

【讨论】:

  • 但我也想在 javascript 中实现一个 longclick 监听器。通过覆盖 onTouchListener 我将关闭视图上的所有长时间点击。怎么会,不能关闭文本选择?我认为这是一件非常基本的事情。
  • 知道了。试试这个:stackoverflow.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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-05
      • 2012-09-01
      • 2018-02-20
      • 2010-09-09
      • 2023-04-07
      • 1970-01-01
      • 2018-05-12
      • 1970-01-01
      相关资源
      最近更新 更多