Android禁止EditText输入框复制粘贴分享
Android禁止长安EditText时输入框弹出复制粘贴分享选项,原理即
- 禁止长按事件
ActionMode
回调- 反射
android.widget.Editor
修改弹框菜单不显示
Android代码:
/** * 禁止输入框复制粘贴菜单 */ public void disableCopyAndPaste(final EditText editText) { try { if (editText == null) { return ; } editText.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { return true; } }); editText.setLongClickable(false); editText.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { // setInsertionDisabled when user touches the view setInsertionDisabled(editText); } return false; } }); editText.setCustomSelectionActionModeCallback(new ActionMode.Callback() { @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { return false; } @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { return false; } @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { return false; } @Override public void onDestroyActionMode(ActionMode mode) { } }); } catch (Exception e) { e.printStackTrace(); } } private void setInsertionDisabled(EditText editText) { try { Field editorField = TextView.class.getDeclaredField("mEditor"); editorField.setAccessible(true); Object editorObject = editorField.get(editText); // if this view supports insertion handles Class editorClass = Class.forName("android.widget.Editor"); Field mInsertionControllerEnabledField = editorClass.getDeclaredField("mInsertionControllerEnabled"); mInsertionControllerEnabledField.setAccessible(true); mInsertionControllerEnabledField.set(editorObject, false); // if this view supports selection handles Field mSelectionControllerEnabledField = editorClass.getDeclaredField("mSelectionControllerEnabled"); mSelectionControllerEnabledField.setAccessible(true); mSelectionControllerEnabledField.set(editorObject, false); } catch (Exception e) { e.printStackTrace(); } }
以上原文地址:https://www.jianshu.com/p/c51a443f2d81
Kotlin代码:
import android.view.* import android.widget.EditText import android.widget.TextView import java.lang.reflect.Field /** * Created by Shirley on 2021/8/26 17:13 */ object EditTextUtil { /** * 禁止输入框复制粘贴菜单 */ fun disableCopyAndPaste(editText: EditText?) { try { if (editText == null) { return } editText.setOnLongClickListener(View.OnLongClickListener { true }) editText.isLongClickable = false editText.setOnTouchListener(View.OnTouchListener { v, event -> if (event.action === MotionEvent.ACTION_DOWN) { // setInsertionDisabled when user touches the view setInsertionDisabled(editText) } false }) editText.customSelectionActionModeCallback = object : ActionMode.Callback { override fun onCreateActionMode(mode: ActionMode?, menu: Menu?): Boolean { return false } override fun onPrepareActionMode(mode: ActionMode?, menu: Menu?): Boolean { return false } override fun onActionItemClicked(mode: ActionMode?, item: MenuItem?): Boolean { return false } override fun onDestroyActionMode(mode: ActionMode?) {} } } catch (e: Exception) { e.printStackTrace() } } private fun setInsertionDisabled(editText: EditText) { try { val editorField: Field = TextView::class.java.getDeclaredField("mEditor") editorField.isAccessible = true val editorObject: Any = editorField.get(editText) // if this view supports insertion handles val editorClass = Class.forName("android.widget.Editor") val mInsertionControllerEnabledField: Field = editorClass.getDeclaredField("mInsertionControllerEnabled") mInsertionControllerEnabledField.isAccessible = true mInsertionControllerEnabledField.set(editorObject, false) // if this view supports selection handles val mSelectionControllerEnabledField: Field = editorClass.getDeclaredField("mSelectionControllerEnabled") mSelectionControllerEnabledField.isAccessible = true mSelectionControllerEnabledField.set(editorObject, false) } catch (e: Exception) { e.printStackTrace() } } }
注意ActionMode不要导错类
分类:
UI组件或小界面
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架