在 EditText 上禁用剪贴板建议中的粘贴

Posted

技术标签:

【中文标题】在 EditText 上禁用剪贴板建议中的粘贴【英文标题】:Disable paste from clipboard suggestions on EditText 【发布时间】:2021-02-17 04:07:00 【问题描述】:

为了防止 EditText 从剪贴板接收内容,我禁用了长按和文本可选,并清除了操作模式菜单:

EditText editText = findViewById(R.id.et);
editText.setCustomSelectionActionModeCallback(new ActionMode.Callback() 

        public boolean onPrepareActionMode(ActionMode mode, Menu menu) 
            return false;
        

        public void onDestroyActionMode(ActionMode mode) 
        

        public boolean onCreateActionMode(ActionMode mode, Menu menu) 
            return false;
        

        public boolean onActionItemClicked(ActionMode mode, MenuItem item) 
            return false;
        
    );
    editText.setTextIsSelectable(false);
    editText.setLongClickable(false);

问题是我不断收到剪贴板建议,这些建议在选择时会粘贴到我的 EditText。如何禁用此功能或直接忽略此粘贴的内容?

【问题讨论】:

“为了防止 EditText 从剪贴板接收内容,我禁用了长按和文本可选,并清除了操作模式菜单”——还有其他方法可以将内容放入您的 @ 987654322@ 从剪贴板或其他地方。这包括热键 (Ctrl-V)、无障碍服务和自动填充。 那么,我怎样才能有效地防止所有这些输入选项粘贴到我的编辑文本中。 AFAIK,你不能,至少在可访问性方面。 【参考方案1】:

要禁用从键盘、键盘扩展、操作菜单和任何其他类型的所有类型的复制过去,您可以将 textChangeListener 添加到您的 EditText 并检查方法 beforeTextChanged,如下所示:

editText.addTextChangedListener(object : TextWatcher 
        override fun afterTextChanged(s: Editable?) 

        override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) 
            if (after - count > 1) 
                editText.setText(s)
                editText.setSelection(s.toString().length)
            
        

        override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int)

    )

如果有人同时超过一个字符,则此解决方案有效。祝你好运

【讨论】:

以上是关于在 EditText 上禁用剪贴板建议中的粘贴的主要内容,如果未能解决你的问题,请参考以下文章

如何禁用vim粘贴到/从系统剪贴板?

三星手机怎么粘贴不了怎么回事

VB如何利用剪贴板复制、粘贴文件,用到啥API

如何使用android粘贴选项

如何在Delphi中使用剪贴板

如何在 PyQt 应用程序退出时禁用清除剪贴板?