如何禁用EditText的键盘剪贴板建议及阻止粘贴内容?
解决EditText禁用剪贴板粘贴及键盘剪贴板建议问题
已经禁用长按和操作菜单后,仍需处理输入法的剪贴板建议及粘贴操作,可通过以下几种方式解决:
方法一:拦截粘贴操作(最可靠)
重写EditText的onTextContextMenuItem方法,从源头拦截粘贴、剪切、复制等相关操作:
class NoPasteEditText(context: Context, attrs: AttributeSet?) : AppCompatEditText(context, attrs) { override fun onTextContextMenuItem(id: Int): Boolean { // 拦截剪贴板相关操作,返回true表示已处理该事件 return when (id) { android.R.id.paste, android.R.id.cut, android.R.id.copy -> true else -> super.onTextContextMenuItem(id) } } }
在布局中使用自定义的NoPasteEditText替代原生EditText即可生效。
方法二:禁用输入法剪贴板建议
通过设置EditText的私有IME属性,提示输入法隐藏剪贴板建议(注:该效果依赖输入法厂商的支持情况):
在XML布局中添加属性:
<EditText ... android:privateImeOptions="disableClipboard" />
或在代码中动态设置:
editText.setPrivateImeOptions("disableClipboard")
方法三:监听文本变化并撤销粘贴(兜底方案)
如果上述方法失效,可通过文本监听检测异常的文本增量,判定为粘贴操作后恢复原文本:
editText.addTextChangedListener(object : TextWatcher { private var lastTextContent = "" override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { lastTextContent = s.toString() } override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { // 当文本长度突然大幅增加时,判定为粘贴操作,恢复之前的文本内容 if (count > before && (s?.length ?: 0) > lastTextContent.length) { editText.setText(lastTextContent) editText.setSelection(lastTextContent.length) } } override fun afterTextChanged(s: Editable?) {} })
内容的提问来源于stack exchange,提问作者Thanos
相关产品推荐
相关产品推荐

