工具篇——NullMenuEditText(禁止复制粘贴功能的EditText)

news/2025/2/26 9:47:51

写代码的四点:

     1.明确需求。要做什么?

     2.分析思路。要怎么做?(1,2,3……)

     3.确定步骤。每一个思路要用到哪些语句、方法和对象。

     4.代码实现。用具体的语言代码将思路实现出来。

 

学习新技术的四点:

     1.该技术是什么?

     2.该技术有什么特点?(使用需注意的方面)

     3.该技术怎么使用?(写Demo)

     4.该技术什么时候用?(在Project中的使用场景 )

----------------------早计划,早准备,早完成。-------------------------

代码如下:

package com.wy.test.other;

import android.content.Context;
import android.util.AttributeSet;
import android.view.ActionMode;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.widget.EditText;
import android.widget.TextView;

import java.lang.reflect.Field;

/**
 * 禁止复制粘贴功能的EditText(用于密码)
 * 1.禁止长按;
 * 2.禁止文本选中;
 * 3.处理横屏;
 * 4.用户选择操作无效化处理
 * 5.处理小米/OPPO手机(反射 android.widget.Editor 修改弹框菜单不显示);
 */
public class NullMenuEditText extends EditText {

    public NullMenuEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        //禁止长按
        setLongClickable(false);
        //禁止文本选中
        setTextIsSelectable(false);
        //EditText在横屏的时候会出现一个新的编辑界面,因此要禁止掉这个新的编辑界面;
        //新的编辑界面里有复制粘贴等功能按钮,目前测试是无效果的,以防外一,建议禁止掉。
        setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI);
        //用户选择操作无效化处理
        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) {

            }
        });

        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();
                }
                return false;
            }
        });
    }

    /**
     * 小米/OPPO手机上禁止复制粘贴功能
     * 反射 android.widget.Editor 修改弹框菜单不显示
     */
    private void setInsertionDisabled() {
        try {
            Field editorField = TextView.class.getDeclaredField("mEditor");
            editorField.setAccessible(true);
            Object editorObject = editorField.get(this);
            Class editorClass = Class.forName("android.widget.Editor");
            Field mInsertionControllerEnabledField = editorClass.getDeclaredField("mInsertionControllerEnabled");
            mInsertionControllerEnabledField.setAccessible(true);
            mInsertionControllerEnabledField.set(editorObject, false);
            Field mSelectionControllerEnabledField = editorClass.getDeclaredField("mSelectionControllerEnabled");
            mSelectionControllerEnabledField.setAccessible(true);
            mSelectionControllerEnabledField.set(editorObject, false);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public boolean onTextContextMenuItem(int id) {
        return true;
    }

    @Override
    public boolean isSuggestionsEnabled() {
        return false;
    }
}

在项目中的应用:

在xml布局文件中直接使用;

<com.wy.test.other.NullMenuEditText
        android:layout_width="match_parent"
        android:layout_height="30dp"
        android:layout_margin="10dp"
        android:background="#eeeeee" />

---------------------------------------------------------------------------------------------------------------------------

早计划,早准备,早完成。 欢迎关注!交流!Star!

GitHub:https://github.com/wangyang0313

微信公众号:一个灵活的胖子MrWang

简书:https://www.jianshu.com/u/e5e733d79b96  


http://www.niftyadmin.cn/n/2108685.html

相关文章

2015让我受益最大的那些书--别找了,都在这里

2015让我受益最大的那些书--别找了&#xff0c;都在这里 时间过得真快&#xff0c;很早就计划写一篇2015的总结&#xff0c;算是对这一年个人整体知识技术体系的梳理&#xff0c;由于出差和项目的关系直到今天才抽出时间。如果用一个字来概括2015年本人的技术体系更新那就是&am…

第五章 面向切面编程(AOP)之二

上一次在第五章中简单的介绍了一下 AOP中几个常用的功能&#xff0c;现在我想通过实际的例子来说明它强大的功能&#xff0c;这些例子是项目中实际用到的&#xff0c;而不是一些没有使用价值的例子。我会介绍它在一个完整的系统中用到的地方&#xff0c;有日志处理&#xff0c;…

工具篇——DateUtil(用于获取时间)

写代码的四点&#xff1a; 1.明确需求。要做什么&#xff1f; 2.分析思路。要怎么做&#xff1f;&#xff08;1,2,3……&#xff09; 3.确定步骤。每一个思路要用到哪些语句、方法和对象。 4.代码实现。用具体的语言代码将思路实现出来。 学习新技术的四点&#xff1a; 1.该技术…

AFNetWorking 网络请求转载

今天开始会写几篇关于AFN源码解读的一些Blog&#xff0c;首先要梳理一下AFN的整体结构(主要是讨论2.x版本的Session访问模块)&#xff1a;我们先看看我们最常用的一段代码&#xff1a; AFHTTPSessionManager *manager [AFHTTPSessionManager manager]; [manager GET:"htt…

一步步教你用3640添加交换模块并桥接PC

实验环境&#xff1a;用3640模拟一台交换机&#xff0c;并将本地PC和虚拟机桥接到交换机上&#xff08;注&#xff1a;虚拟机只能选择Vmvare&#xff0c;不能选择VPC&#xff09;<?xml:namespace prefix v ns "urn:schemas-microsoft-com:vml" /><?xml:…

android架构设计之插件化、组件化

转载仅供本人存档及后续研究使用&#xff0c;请尊重原创。 转载自&#xff1a;https://blog.csdn.net/mhhyoucom/article/details/79000072 如今移动app市场已经是百花齐放&#xff0c;其中有不乏有很多大型公司、巨型公司都是通过app创业发展起来的&#xff1b;app类型更加丰…

使用flv.js做直播

为什么要在这个时候探索flv.js做直播呢&#xff1f;原因在于各大浏览器厂商已经默认禁用Flash&#xff0c;之前常见的Flash直播方案需要用户同意使用Flash后才可以正常使用直播功能&#xff0c;这样的用户体验很致命。 在介绍flv.js之前先介绍下常见的直播协议以及给出我对它们…

SAS接口

SAS(Serial Attached SCSI)即串行连接SCSI&#xff0c;是新一代的SCSI技术&#xff0c;和现在流行的Serial ATA(SATA)硬盘相同&#xff0c;都是采用串行技术以获得更高的传输速度&#xff0c;并通过缩短连结线改善内部空间等。SAS是并行SCSI接口之后开发出的全新接口。此接口的…