Android:禁用网页视图中的文本选择
Posted
技术标签:
【中文标题】Android:禁用网页视图中的文本选择【英文标题】:Android: Disable text selection in a webview 【发布时间】:2011-07-03 17:17:08 【问题描述】:我正在使用 webview 在我的应用程序中呈现一些格式化的内容。对于某些交互(特定于某些 dom 元素),我使用 javascript 和WebView.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:禁用网页视图中的文本选择的主要内容,如果未能解决你的问题,请参考以下文章