禁止EditText 输入粘贴版内容

   有时候需要在edittext中禁止输入粘贴内容,防止论坛灌水、输入大量重复信息等,这就要监听复制粘贴等操作:


重写EditText的
public boolean onTextContextMenuItem(int id) {
return super.onTextContextMenuItem(id);
}
方法,根据id判断当前操作:
id:16908319
全选
id:16908328
选择
id:16908320
剪贴
id:16908321
复制
id:16908322
粘贴
id:16908324
输入法

      自定义EditText, 然后重写onTextContextMenuItem方法,在这里面查看id就知道对应的操作了

public class MyEditText extends EditText {

public MyEditText(Context context) {
super(context);
}

public MyEditText(Context context, AttributeSet attrs) {
super(context, attrs);
}

@Override
public boolean onTextContextMenuItem(int id) {
System.out.println("id:" + id);
return super.onTextContextMenuItem(id);
}

}
也可以改变它的粘贴内容:


先看看TextView(EditText extends TextView)源码中对于复制黏贴的实现过程:

 public boolean onTextContextMenuItem(int id) {
        int min = 0;
        int max = mText.length();

        if (isFocused()) {
            final int selStart = getSelectionStart();
            final int selEnd = getSelectionEnd();

            min = Math.max(0, Math.min(selStart, selEnd));
            max = Math.max(0, Math.max(selStart, selEnd));
        }

        ClipboardManager clip = (ClipboardManager)getContext()
                .getSystemService(Context.CLIPBOARD_SERVICE);

        switch (id) {
           ......

            case ID_CUT:                //裁剪
                clip.setText(mTransformed.subSequence(min, max));
                ((Editable) mText).delete(min, max);
                stopTextSelectionMode();
                return true;

            case ID_COPY:    //复制
                clip.setText(mTransformed.subSequence(min, max));
                stopTextSelectionMode();
                return true;

            case ID_PASTE://粘贴
                CharSequence paste = clip.getText();//得到粘贴版内容

                if (paste != null && paste.length() > 0) {
                    long minMax = prepareSpacesAroundPaste(min, max, paste);
                    min = extractRangeStartFromLong(minMax);
                    max = extractRangeEndFromLong(minMax);
                    Selection.setSelection((Spannable) mText, max);
                    ((Editable) mText).replace(min, max, paste);
                    stopTextSelectionMode();
                }
                return true;

         ......
            }

        return false;
    }

 实现思路:

          只要我们重设粘贴板的内容就可以,我们需要自定义EditText,重写它的粘贴板内容

        这个是给粘贴文本添加内容,比如前缀。也可以做其他设置,或用正则表达式替换,过滤等。

public class MyEditText extends EditText {
         private static final int ID_PASTE = android.R.id.paste;

         public MyEditText(Context context, AttributeSet attrs) {
                 super(context, attrs);
         }

         @Override
         public boolean onTextContextMenuItem(int id) {
                 if(id == ID_PASTE){
                 ClipboardManager clip = (ClipboardManager)getContext().getSystemService(Context.CLIPBOARD_SERVICE);
                 clip.setText("增加的内容==>"+clip.getText());
                 }
                 return super.onTextContextMenuItem(id);
         }
 }
布局文件中:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent" >

     <com.example.customeredittexttest.MyEditText
         android:id="@+id/edit"
         android:layout_width="match_parent"
         android:layout_height="50dip"
         android:layout_alignParentTop="true"
          />

 </RelativeLayout>[/
效果图:



demo源码地址:

EditText监听粘贴内容 
http://download.csdn.net/detail/xiaobijia/8154695



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值