android TextView屏蔽复制粘贴文本选择菜单
方式一:
设置handle的size为0,这种方式对原生的系统有效,对国产room无效
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><size
android:height="0dp"android:width="0dp"/></shape><TextView
android:textSelectHandle="@drawable/select_handle"android:textSelectHandleLeft="@drawable/select_handle"android:textSelectHandleRight="@drawable/select_handle"/>
方式二:
EditText中的文字默认长按呼出文本选择菜单,而TextView需要设置android:textIsSelectable=”true”。长按时会呼出菜单,可以设置
setLongClickable(false);
修改文本选择菜单内容,只需要为TextView或者EditText设置setCustomSelectionActionModeCallback()方法,并且在方法里实现ActionMode.Callback()或ActionMode.Callback2()接口。
setLongClickable(false);setTextIsSelectable(false);setCustomSelectionActionModeCallback(new ActionMode.Callback() {@Overridepublic boolean onCreateActionMode(ActionMode mode, Menu menu) {return false;}@Overridepublic boolean onPrepareActionMode(ActionMode mode, Menu menu) {return false;}@Overridepublic boolean onActionItemClicked(ActionMode mode, MenuItem item) {return false;}@Overridepublic void onDestroyActionMode(ActionMode mode) {}});
经过测试这种方式对原生系统或者部分国产机有效(oppo有效,部分华为有效,小米无效)
方式三:反射调用Handle hide相关函数,对全部机型有效。
在TextView的Editor中有下面一段代码
if (!mInsertionControllerEnabled) {hideInsertionPointCursorController();if (mInsertionPointCursorController != null) {mInsertionPointCursorController.onDetached();mInsertionPointCursorController = null;}}if (!mSelectionControllerEnabled) {stopTextActionMode();if (mSelectionModifierCursorController != null) {mSelectionModifierCursorController.onDetached();mSelectionModifierCursorController = null;}}
尝试设置mInsertionControllerEnabled = false 和 mSelectionControllerEnabled = false,来达到屏蔽文本选择菜单效果。
测试发现,MIUI在按下时,都会创建mInsertionPointCursorController和mSelectionModifierCursorController,并且显示select handle,也就是那个讨厌的捶捶。每次按下后,这两个变量又变成true。
既然MIUI要显示,那我们可以在它显示完成后隐藏,就可以屏蔽了,按照这个思路,在TextView的onTouchEvent中,调用hide();
@Overridepublic boolean onTouchEvent(MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_CANCEL:case MotionEvent.ACTION_UP:postDelayed(new Runnable() {@Overridepublic void run() {setSelectHandleDisabled();}}, 50); // 延迟50ms,等room显示handle完后,再隐藏break;default:break;}return super.onTouchEvent(event);}
private void setSelectHandleDisabled() {try {Field mEditor = TextView.class.getDeclaredField("mEditor");mEditor.setAccessible(true);Object object = mEditor.get(this);Class mClass = Class.forName("android.widget.Editor");// 选中时handleMethod selectionController = mClass.getDeclaredMethod("getSelectionController");selectionController.setAccessible(true);Object invokeSelect = selectionController.invoke(object);Method hideSelect = invokeSelect.getClass().getDeclaredMethod("hide");hideSelect.invoke(invokeSelect);// 插入时handleMethod insertionController = mClass.getDeclaredMethod("getInsertionController");insertionController.setAccessible(true);Object invokeInsert = insertionController.invoke(object);Method hideInsert = invokeInsert.getClass().getDeclaredMethod("hide");hideInsert.invoke(invokeInsert);} catch (Exception e) {}}
android TextView屏蔽复制粘贴文本选择菜单相关推荐
- android TextView中ClickableSpan与文本自由复制(TextIsSelectable)冲突问题
上一篇文章解决了UrlSpan与文本中url链接识别和设置的问题,超链接可以正常显示了.但由于用户期望TextView中的文章内容可以自由复制,这个需求嘛实现起来就是设置下textView.setTe ...
- Android EditText禁止复制粘贴
1,自定义EditText package com.example.ui; import android.annotation.SuppressLint; import android.content ...
- 【问题解决】微软OneNote使用笔记,Ditto解决OneNote复制粘贴文本输出图片问题
微信关注 "DLGG创客DIY" 设为"星标",重磅干货,第一时间送达. 白嫖用onenote和onedrive有段时间了,简单粗暴好用,没得说. 先总结(BB ...
- Android实现一键复制粘贴,兼容低版本系统(api 11以下)
Android实现一键复制粘贴,兼容低版本系统(api11以下) /** * 实现文本复制功能 * @param content * @return t ...
- 【转】vi编辑器中如何复制粘贴文本
转自:http://old.blog.edu.cn/user2/icethawless/archives/2006/1489681.shtml vi中多个文件相互之间的复制.粘贴功能简介 大家在vi编 ...
- vim可视模式下复制粘贴文本
[操作步骤] vim编辑器有两种操作模式:普通模式.插入模式.当打开要编辑的文件时,vim编辑器会进入普通模式.在普通模式下按 i 键进入插入模式,在插入模式下按 Esc 键返回普通模式. 在普通模式 ...
- VirtualBox 中 Ubuntu 16.04 虚拟机与主机之间复制粘贴文本
VirtualBox 中 Ubuntu 16.04 虚拟机与主机之间复制粘贴文本 1. Settings -> General -> Advanced Bidirectional 2. 设 ...
- linux内如何复制粘贴文本
linux内如何复制粘贴文本 在终端中使用键盘快捷键进行复制粘贴 为什么 Linux 终端不使用"通用"的 Ctrl+C 和 Ctrl+V 在终端中使用键盘快捷键进行复制粘贴 在 ...
- OneNote | 复制粘贴文本输出图片解决方案
OneNote | 复制粘贴文本输出图片解决方案 OneNote粘贴问题 Solution 1: 中转 Solution 2: 外部软件(推荐) Ditto使用教程1 Ditto使用教程2(推荐) O ...
- adb 命令 pc端 复制粘贴 文本到android设备
假如你像我一样在寻找android下通过命令复制粘贴的方法. 不过android上是没有直接进行复制粘贴剪切板的命令,只有间接实现: 1.android设备 首先android设备上,要把光标焦点定位 ...
最新文章
- WPF-002 下拉列表的简单实现
- sqlite3 多线程 c语言,sqlite3 c语言编程 之 三个基本函数
- 在Ngnix上部署Flask应用
- 看完这篇,你也是字符编码大神!
- Cilium 首次集成国内云服务,阿里云 ENI 被纳入新版本特性
- 在 MySQL 中使用 explain 查询 SQL 的执行计划(转自: 数据分析与开发)
- Visual Studio 2017 ASP.NET Core开发
- python——成语接龙小游戏
- 如何进行云主机带宽测试
- 2.Shell 编程从入门到精通 --- Shell编程基础
- 小爱mini改aux立体声_拆解报告:Redmi小爱音箱Play
- 万年历显示c语言百度文库,C语言万年历
- python dataframe修改_pandas DataFrame的修改方法
- java 避免gc_减少JAVA GC
- T88 excel 行高列宽单位
- 高德POI搜索:地点关键词搜索
- c++——vc++中的六种Runtime Library的类型
- C语言基础——字符串指针(指向字符串的指针)
- 三星SCX-4521F 4725F内存接收墨粉用尽问题
- 读《赤脚医生手册》有感之葱豉汤
热门文章
- php背景图片居中对齐命令,css怎么设置背景图片自适应居中
- Raki的读paper小记:Code and Named Entity Recognition in StackOverflow
- mycat管理mysql_Mycat用户和权限控制管理
- Centos7 安装MySQL5
- jquery migrate 应用迁移辅助插件
- php dom 分离html内容
- Syslog日志中心服务器收集windows和linux客户端日志
- a:link,a:visited,a:hover,a:active
- 一线城市房价下跌 机构称年内限购难放松
- 矩阵快速乘法---代码